awk:比较两组数字(由随机和严格规则生成)

时间:2018-03-31 16:55:08

标签: awk grep

我有很多文件包含一些固定的单词和数字: 第一组数字的固定长度为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

..只有问题(没有正确生成)行和文件名。

谢谢! :)

3 个答案:

答案 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)

使用此方式,意图是人类可读和可维护的:

$ 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 '...' {} \;

或你认为合适的类似。