如何删除另一个文件中存在的行?

时间:2018-05-16 01:42:47

标签: bash macos text-processing

我每天都有一个文件,其中有10,000条记录,其中99%是在最后一天的文件中。如何使用macOS命令行删除前一天文件中存在的较新文件中的行?

remove_duplicates newfile oldfile

这些文件如下所示:

"First Last"\t"email"\t"phone"\t"9 more columns..."

注意,我尝试this awk solution,但它没有输出任何内容,即使我确认重复的行。

3 个答案:

答案 0 :(得分:3)

comm命令接受两个文件参数并打印三列:第一个文件唯一的行,第二个文件唯一的行以及两个文件中出现的行。因此,如果您有两个文件,其中一个是另一个的副本加上几行,如下所示:

oldfile

line1
line2
line3

newfile

line1
line2
line3
line4
line5

您可以使用comm,如下所示:

$ comm -13 oldfile newfile
line4
line5

其中-13代表“禁止第1列和第3列”,即仅打印第二个文件唯一的行。

comm期望对其输入进行排序,如果不是(至少是comm的GNU版本,则会抱怨),但如果您的文件确实是彼此的副本加上额外的行在其中一个中,您可以禁止该警告:

comm --nocheck-order -13 oldfile newfile

--nocheck-order仅存在于GNU comm中,它是GNU coreutils的一部分(例如,可以通过自制软件安装)。

如果关于未分类文件的警告是显示停止并且输出行的顺序无关紧要,您还可以对输入文件进行排序:

comm -13 <(sort oldfile) <(sort newfile)

答案 1 :(得分:2)

您可以将grep-v(反转匹配)和-f(文件)选项一起使用:

grep -v -f oldfile newfile > newstrip

它匹配 newfile 中不在旧文件中的任何行,并将其保存到 newstrip 。如果您对结果感到满意,那么您可以在以后轻松完成:

mv newstrip newfile

这将使用 newstrip 覆盖新文件(删除新闻通讯)。

答案 2 :(得分:1)

就bash脚本而言,我能想出的解决方案是:

sort newfile | uniq | cat oldfile oldfile - | sort | uniq -u

细分:

  • sort newfile:对newfile中的行进行排序(uniq必需)
  • uniq:最多保留每个相同行的一个副本
  • cat oldfile oldfile -:宣读oldfile 两次,并将之前调用的输出追加到uniq
  • sort:根据uniq
  • 的要求对行进行排序
  • uniq -u:仅保留恰好出现一次的行

由于oldfile被写出两次,oldfile中的每一行都将被uniq -u丢弃。您将留下仅显示在newfile

中的行

明显的警告:您的文件现已排序,并且您只有每个重复行中的一个。