我有很多文件包含一些固定的单词和数字: 第一组数字的固定长度为7位:前4个像随机前缀(例如100,200,300但可以是其他...)我们不需要它,我们对其余4位数感兴趣。 SECOND SET of number / s是根据FIRST SET的最后4位数生成的数字(xxx7777 = 7777; xxx0066 = 66)。您可以看到SECOND SET不能有前导零,它们已被删除,这是一个规则。
输入
first second third 1007777 fourth 7777
...
first second third 2008341 fourth 8341
...
first second third 3000005 fourth 5
...
...
first second third 2008341 fourth 8
...
first second third 2008341 fourth 341
我在其他示例中找到了 - 如何使用grep找到感兴趣的行,但我没有找到AWK示例做我想要的,因为带有前导零的规则可能我遇到了问题..
我尝试找到错误的世代:
grep -Pr 'first second third' docs/test/*.txt | awk '{ if($4=$6) print $4 " " $6}'
7777 7777
8341 8341
5 5
8 8
341 341
正确的输出应如下所示:
2008341 8
2008341 341
..只有问题(没有正确生成)行和文件名。
谢谢! :)
答案 0 :(得分:0)
关注awk
可能对您有帮助。
awk '{num=split($4,array,"[0+]")} array[num]+0==$NF{next} NF{print $(NF-2),$NF}' Input_file
解决方案第二: 比上述解决方案更短的解决方案。
awk '{num=split($4,array,"0+")} array[num]+0!=$NF{print $(NF-2),$NF}' Input_file
答案 1 :(得分:0)
使用此gnu方式,意图是人类可读和可维护的:
$ grep -r foobarbase . | awk '
{match($4, /[0-9]{4}$/, a); #1
a[0]=gensub(/^0+/, "", "g", a[0])} #2
$NF != a[0] #3
' file
first second third 2008341 fourth 8
first second third 2008341 fourth 341
#1获取第4列的最后4位数字并指定
a
数组匹配#2删除所有前导0
#3如果cutted部分与上一列不同,
print
(真实条件下的默认awk行为)答案 2 :(得分:0)
$ awk '/first second third/ && (substr($4,4)+0 != $NF) {print FILENAME, $4, $NF}' file
file 2008341 8
file 2008341 341
将其命名为:
awk '...' docs/test/*.txt
或:
find docs -name '*.txt' -exec awk '...' {} \;
或你认为合适的类似。