【问题标题】:awk: Compare two sets of numbers (generated by random and strict rules)awk:比较两组数字(由随机和严格规则生成)
【发布时间】:2018-04-01 03:49:16
【问题描述】:

我有很多文件包含一些固定的单词和数字: FIRST SET 数字有 7 位的固定长度:前 4 位就像一个随机前缀(例如是 100,200,300,但也可以是其他 ..)我们不需要它,我们对剩下的 4 位感兴趣。 number/s 的 SECOND SET 是根据 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

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

谢谢! :)

【问题讨论】:

  • $4=$6 是一个作业。您的意思是 $4==$6 进行测试。当然还有其他问题...
  • 给新手的建议:如果一个答案解决了您的问题,请点击旁边的大复选标记 (✓) 接受它,也可以选择投票(投票至少需要 15 个声望)点)。如果您发现其他答案有帮助,请给他们投票。接受和投票有助于未来的读者。请看the relevant help-center article

标签: awk grep


【解决方案1】:
$ 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 '...' {} \;

或您认为合适的类似内容。

【讨论】:

  • 谢谢!当我进行测试时效果很好。一个问题,因为事实证明我的实际数据(当我询问时我无法访问)字符串的排列方式不同,并且当我对您的解决方案进行更改时不起作用: ( 第一 1007777 第二 7777 第三 awk '/first/ && (substr($2,4)+0 != $NF) {print FILENAME, $2, $NF}' test.txtr
  • 不客气。将 $NF 更改为 $4,就像将 $4 更改为 $2 一样。
【解决方案2】:

使用这种 方式,旨在成为人类可读和可维护的:

$ 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 位,并用 match 分配 a 数组
  • #2
    删除所有前导0
  • #3
    如果切割部分与最后一列不同,print(真实条件下的默认 awk 行为)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多