【问题标题】:Comparing two columns in two files using awk使用 awk 比较两个文件中的两列
【发布时间】:2015-02-22 15:12:38
【问题描述】:

我试图以这种方式比较两个不同的文件,比如“file1”和“file2”。 如果两个文件中的字段 $2 和 $3 相同,则打印 file2 的 $0。这是一个例子:

file1
E 352 697 
E 25 692
E 510 744

file2
E 335 705 1 1
E 267 792 1 2
E 365 395 1 3
E 25 692 1 4
E 566 624 1 5
E 227 358 1 6
E 516 554 1 7
E 510 744 1 8
E 234 790 1 9
E 352 697 1 10

期望的输出:

E 352 697 1 10
E 25 692 1 4
E 510 744 1 8

请注意,file1 中的所有对 $2,$3 都包含在 file2 中,并且输出文件的行数与 file1 相同。 我知道有很多类似问题的问题,但所有答案都没有用。 我试过用:

awk 'FNR==NR {a[$2]; b[$3]; next} $2 in a && $3 in b' file1 file2 > output

它可以工作,但在输出文件中有额外的行。你可以帮帮我吗?谢谢!

【问题讨论】:

  • 但是脚本给了我想要的输出。额外的行是什么意思?
  • 我只放了一些文件行,原始文件要大得多。这意味着在输出文件中,file2 中存在行,而不是 file1 中存在行。我想这是因为 $2 或 $3 存在于 file1 但不是同时存在

标签: awk


【解决方案1】:

这个awk 应该这样做:

awk 'FNR==NR {a[$0];next} {for (i in a) if ($0~i) print}' file1 file2
E 25 692 1 4
E 510 744 1 8
E 352 697 1 10

它将file1 存储在数组a 中。然后循环槽file2并测试它是否包含来自数组a的数据,如果是,则打印该行。

【讨论】:

  • 不,它不会,它只是从当前发布的示例输入中产生您期望的输出。它会因其他输入集而失败,例如当 file1 包含像 E 352 69 这样的行时。
  • @EdMorton 我理解为什么它不应该从您的评论中工作,但如果我将 f1 更改为 E 352 69 它不会打印该行并提供与您的解决方案相同的输出。你能帮我理解为什么它似乎有效,什么时候不应该有效。
  • file1 的行尾可能有空格。
  • @EdMorton 你总是正确的,有一个空格......谢谢
【解决方案2】:
awk 'NR==FNR{a[$2,$3];next} ($2,$3) in a' file1 file2

【讨论】:

  • 我同意这个解决方案。实际上它和我的第一次试验相似,但我在语法上犯了一些错误。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
  • 2015-10-22
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
相关资源
最近更新 更多