awk:比较两组数字(由随机和严格规则生成)
我有许多包含一些固定单词和数字的文件: 第一组数字的固定长度为7位:前4个数字类似于随机前缀(例如100200300,但可以是其他数字)。我们不需要它,我们对其余4位数字感兴趣。 第二组数字是根据第一组数字的最后4位数字生成的数字(xxx7777=7777;xxx0066=66)。您可以看到,第二个集合不能有前导零,它们已经被切掉,这是一条规则 输入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
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 thirdawk'/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 '...' {} \;