【问题标题】:Awk: using a file to filter another one (out.tr)awk:使用一个文件过滤另一个文件(out.tr)
【发布时间】:2018-06-25 15:26:07
【问题描述】:

帮助awk,使用一个文件过滤另一个文件 我有一个主文件:

...
17,466971 0,095185 17,562156 id 676
17,466971 0,096694 17,563665 id 677
17,466971 0,09816 17,565131 id 678
17,466971 0,099625 17,566596 id 679
17,466971 0,101091 17,568062 id 680
17,466971 0,016175 17,483146 id 681
17,466971 0,101793 17,568764 id 682
17,466971 0,10253 17,569501 id 683
38,166772 0,08125 38,248022 id 1572
38,166772 0,082545 38,249317 id 1573
38,233772 0,005457 38,239229 id 1574
38,233772 0,082113 38,315885 id 1575
38,299771 0,081412 38,381183 id 1576
38,299771 0,006282 38,306053 id 1577
38,299771 0,083627 38,383398 id 1578
38,299771 0,085093 38,384864 id 1579
38,299771 0,008682 38,308453 id 1580
38,299771 0,085094 38,384865 id 1581
...

我想根据这个其他文件抑制/删除一些行,最后一列(id):

...
d 17.483146 1 0 udp 181 ------- 1 19.0 2.0 681
d 38.239229 1 0 udp 571 ------- 1 19.0 2.0 1574
d 38.306053 1 0 udp 1000 ------- 1 19.0 2.0 1577
d 38.308453 1 0 udp 1000 ------- 1 19.0 2.0 1580
d 38.372207 1 0 udp 546 ------- 1 19.0 2.0 1582
d 38.441845 1 0 udp 499 ------- 1 19.0 2.0 1585
d 38.505262 1 0 udp 616 ------- 1 19.0 2.0 1586
d 38.572324 1 0 udp 695 ------- 1 19.0 2.0 1588
d 38.639246 1 0 udp 597 ------- 1 19.0 2.0 1590
d 38.639758 1 0 udp 640 ------- 1 19.0 2.0 1591 
...

对于上面的示例,结果将是:

17,466971 0,095185 17,562156 id 676
17,466971 0,096694 17,563665 id 677
17,466971 0,09816 17,565131 id 678
17,466971 0,099625 17,566596 id 679
17,466971 0,016175 17,483146 id 680
17,466971 0,101793 17,568764 id 682
17,466971 0,10253 17,569501 id 683
38,166772 0,08125 38,248022 id 1572
38,166772 0,082545 38,249317 id 1573
38,233772 0,082113 38,315885 id 1575
38,299771 0,081412 38,381183 id 1576
38,299771 0,083627 38,383398 id 1578
38,299771 0,085093 38,384864 id 1579
38,299771 0,085094 38,384865 id 1581

删除的行是:

17,466971 0,101091 17,568062 id 681
38,233772 0,005457 38,239229 id 1574
38,299771 0,006282 38,306053 id 1577
38,299771 0,008682 38,308453 id 1580

是否有使用 awk 的命令来自动执行此操作?

提前谢谢你

【问题讨论】:

  • 添加输入输出示例总是好的,但不要反应过度(:
  • 为什么id 681没有被删除,为什么680被删除了?
  • 你是对的,将 680 更改为 681。谢谢

标签: awk


【解决方案1】:

这是使用awk的一种方式:

awk 'FNR==NR { a[$NF]; next } !($NF in a)' other main

结果:

17,466971 0,095185 17,562156 id 676
17,466971 0,096694 17,563665 id 677
17,466971 0,09816 17,565131 id 678
17,466971 0,099625 17,566596 id 679
17,466971 0,101091 17,568062 id 680
17,466971 0,101793 17,568764 id 682
17,466971 0,10253 17,569501 id 683
38,166772 0,08125 38,248022 id 1572
38,166772 0,082545 38,249317 id 1573
38,233772 0,082113 38,315885 id 1575
38,299771 0,081412 38,381183 id 1576
38,299771 0,083627 38,383398 id 1578
38,299771 0,085093 38,384864 id 1579
38,299771 0,085094 38,384865 id 1581

删除感叹号以显示“已删除”行:

awk 'FNR==NR { a[$NF]; next } $NF in a' other main

结果:

17,466971 0,016175 17,483146 id 681
38,233772 0,005457 38,239229 id 1574
38,299771 0,006282 38,306053 id 1577
38,299771 0,008682 38,308453 id 1580

或者,如果您想要两个文件,一个包含值“present”,另一个包含值“deleted”,请尝试:

awk 'FNR==NR { a[$NF]; next } { print > ($NF in a ? "deleted" : "present") }' other main

解释1:

FNR==NR { ... } 是一种常用的构造,它仅对参数列表中的第一个文件返回 true。在这种情况下,awk 将首先读取文件“其他”。在处理这个文件时,最后一列 ($NF) 中的值被添加到一个数组中(我们称之为a)。 next 然后跳过处理我们的其余代码。读取第一个文件后,FNR 将不再等于 NR,因此将“允许”awk 跳过 FNR--NR { ... } 块并开始处理应用于参数列表中的第二个文件“main”。例如,!($NF in a),如果$NF 不在数组中,则不会打印该行。

解释2:

关于哪一列,您可能会发现这很有帮助:

$1         # the first column
$2         # the second column
$3         # the third column

$NF        # the last column
$(NF-1)    # the second last column
$(NF-2)    # the third last column

【讨论】:

  • 漂亮的上帝,但是程序怎么知道我们在谈论最后一列?在您的解决方案中,我没有看到任何列指标,例如 $5。
  • @RobertCantarutti:我们使用$NF 表示最后一个字段。 NF 提供 total number of fields in a record。当我们在前面添加一个美元符号时,这将评估为最后一个字段。我希望这是有道理的。如果您愿意,我会用一些解释来更新我的答案。
  • 所以我可以指出我想使用哪个列?例如:如果在“id 681”之后还有另一个列,例如:主文件中的“id 681 xpto”。您将如何表示此列?
  • @RobertCantarutti:我添加了一些关于代码如何工作的解释以及关于使用哪个变量来指示某个列的解释。最终,您选择的字段变量将取决于您的数据的组织方式。例如,如果感兴趣的列始终是第五列,则使用$5,如果它始终是倒数第二列,则使用$(NF-1)。如果需要更多说明,请告诉我。干杯。
  • 今天回来咨询,再次表示感谢。这是课堂解释!太棒了
猜你喜欢
  • 1970-01-01
  • 2016-01-21
  • 2017-01-14
  • 2016-01-03
  • 2012-09-25
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多