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

awk:比较两组数字(由随机和严格规则生成),awk,grep,gnu,Awk,Grep,Gnu,我有许多包含一些固定单词和数字的文件: 第一组数字的固定长度为7位:前4个数字类似于随机前缀(例如100200300,但可以是其他数字)。我们不需要它,我们对其余4位数字感兴趣。 第二组数字是根据第一组数字的最后4位数字生成的数字(xxx7777=7777;xxx0066=66)。您可以看到,第二个集合不能有前导零,它们已经被切掉,这是一条规则 输入 first second third 1007777 fourth 7777 ... first second third 2008341 fou

我有许多包含一些固定单词和数字的文件: 第一组数字的固定长度为7位:前4个数字类似于随机前缀(例如100200300,但可以是其他数字)。我们不需要它,我们对其余4位数字感兴趣。 第二组数字是根据第一组数字的最后4位数字生成的数字(xxx7777=7777;xxx0066=66)。您可以看到,第二个集合不能有前导零,它们已经被切掉,这是一条规则

输入

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
..只有问题(不是正确生成的)行和文件名

谢谢!:)

使用这种方式,旨在使其易于阅读和维护:

$ grep -r foobarbase . | awk '
    {match($4, /[0-9]{4}$/, a);            #1
    a[0]=gensub(/^0+/, "", "g", a[0])}     #2
    $NF != a[0]                            #3
' file
输出: 说明:
  • 删除所有前导0
  • #3如果切割部分与最后一列不同,
    打印
    (真实条件下的默认awk行为)
称之为:

awk '...' docs/test/*.txt
或:


或类似的作业。

$4=$6
是一项作业。您的意思是测试的
$4==6
。当然还有其他问题……给新来者的建议:如果一个答案解决了你的问题,请点击大复选标记接受它(✓) 在它旁边,也可以选择向上投票(向上投票需要至少15个信誉点)。如果你发现其他答案有帮助,请向上投票。接受和向上投票有助于未来的读者。请看谢谢!在我进行测试时效果非常好。一个问题,因为我发现我的实际数据(当我询问时,我无法访问)字符串的排列方式不同,并且当我对您的解决方案进行更改时,字符串不起作用:(first 1007777 second 7777 third
awk'/first/&&(substr($2,4)+0!=$NF){print FILENAME,$2,$NF}test.txtr
不客气。将$NF更改为$4,就像将$4更改为$2一样。 #1 #2 #3
$ 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 '...' {} \;