首页 > 解决方案 > awk 数字提取长度

问题描述

我无法从 $3 列的 file1 中捕获数字,应该满足条件,即仅提取下划线之前或下划线之后的确切 8 个数字长度的数字。

下面这行不通。只有第二个有点接近解决方案:

awk '{gsub(/[^0-9]{8}/,"",$3) && $22 = substr($3,1,8)}1' file1
awk '{gsub(/[^[:digit:]]/,"",$3) && $3 = substr($3,1,8)}1' file1

文件1:

44446464654 field 2020135_7777_5x_definition
49989798797 mach 202013_7777_a5_19800511
498797877 pat math_200418_memo05874_12345678
44444 def math_200418_memo05874789_12345678
5659 explaination 28008874_memo
5659 explaination _28008874_memo

需要的输出:

49989798797 mach 19800511
498797877 pat 12345678
44444 def 12345678
5659 explaination 28008874
5659 explaination 28008874

标签: awknumbersextractionmaxlength

解决方案


使用 GNU awk。拆分数组中的最后一个字段 ( $NF)并对其元素使用 for 循环。_在每个循环中,使用正则表达式检查当前元素的内容。

awk '{split($NF,array,"_"); for(i in array) { if(array[i]~/^[0-9]{8}$/) { print $1,$2,array[i]; next } } }' file

输出:

49989798797 马赫 19800511
498797877 拍拍 12345678
44444 定义 12345678
5659解释28008874
5659解释28008874

请参阅:8 个强大的 Awk 内置变量——FS、OFS、RS、ORS、NR、NF、FILENAME、FNR


推荐阅读