awk 数字提取长度
awk numbers extraction length
我无法从 $3 列的文件 1 中捕获数字,应该满足条件,即只提取下划线之前或下划线之后正好 8 个数字长度的数字。
下面这个不行。只有第二个有点接近解决方案:
awk '{gsub(/[^0-9]{8}/,"",) && = substr(,1,8)}1' file1
awk '{gsub(/[^[:digit:]]/,"",) && = substr(,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
使用 GNU awk。将数组中的最后一个字段 ($NF
) 与 _
拆分,并对其元素使用 for 循环。在每个循环中使用正则表达式检查当前元素的内容。
awk '{split($NF,array,"_"); for(i in array) { if(array[i]~/^[0-9]{8}$/) { print ,,array[i]; next } } }' file
输出:
49989798797 mach 19800511
498797877 pat 12345678
44444 def 12345678
5659 explaination 28008874
5659 explaination 28008874
参见:8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR
我无法从 $3 列的文件 1 中捕获数字,应该满足条件,即只提取下划线之前或下划线之后正好 8 个数字长度的数字。
下面这个不行。只有第二个有点接近解决方案:
awk '{gsub(/[^0-9]{8}/,"",) && = substr(,1,8)}1' file1
awk '{gsub(/[^[:digit:]]/,"",) && = substr(,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
使用 GNU awk。将数组中的最后一个字段 ($NF
) 与 _
拆分,并对其元素使用 for 循环。在每个循环中使用正则表达式检查当前元素的内容。
awk '{split($NF,array,"_"); for(i in array) { if(array[i]~/^[0-9]{8}$/) { print ,,array[i]; next } } }' file
输出:
49989798797 mach 19800511 498797877 pat 12345678 44444 def 12345678 5659 explaination 28008874 5659 explaination 28008874
参见:8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR