提取 2 个集合/文件之间的唯一值

新手上路,请多包涵

在 linux/shell 环境中工作,我怎样才能完成以下任务:

文本文件 1 包含:

 1
2
3
4
5

文本文件 2 包含:

 6
7
1
2
3
4

我需要提取文件 2 中不在文件 1 中的条目。因此,在此示例中为“6”和“7”。

如何从命令行执行此操作?

非常感谢!

原文由 mark 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 938
2 个回答
$ awk 'FNR==NR {a[$0]++; next} !($0 in a)' file1 file2
6
7

代码如何工作的解释:

  • 如果我们正在处理 file1,请跟踪我们看到的每一行文本。
  • 如果我们正在处理 file2,并且没有看到行文本,则打印它。

细节说明:

  • FNR 是当前文件的记录号
  • NR 是所有输入文件的当前总记录数
  • FNR==NR 仅在我们读取 file1 时为真
  • $0 是当前行文本
  • a[$0] 是一个散列,其键设置为当前文本行
  • a[$0]++ 我们看到的当前文本行的轨道
  • !($0 in a) 只有当我们没有看到行文本时才为真
  • 如果上述模式返回 true,则打印文本行,这是未给出显式操作时的默认 awk 行为

原文由 SiegeX 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用一些鲜为人知的实用程序:

 sort file1 > file1.sorted
sort file2 > file2.sorted
comm -1 -3 file1.sorted file2.sorted

This will output duplicates, so if there is 1 3 in file1 , but 2 in file2 , this will still output 1 3 .如果这不是您想要的, sort 的输出通过 uniq 到文件中:

 sort file1 | uniq > file1.sorted
sort file2 | uniq > file2.sorted
comm -1 -3 file1.sorted file2.sorted

GNU coreutils 包中有许多实用程序允许进行各种文本操作。

原文由 Daniel Gallagher 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题