我每天都有一个文件,其中有10,000条记录,其中99%是在最后一天的文件中。如何使用macOS命令行删除前一天文件中存在的较新文件中的行?
remove_duplicates newfile oldfile
这些文件如下所示:
"First Last"\t"email"\t"phone"\t"9 more columns..."
注意,我尝试this awk
solution,但它没有输出任何内容,即使我确认重复的行。
答案 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
。
明显的警告:您的文件现已排序,并且您只有每个重复行中的一个。