我有两个大文件(每个 2gig)列出并随机排序,我需要找到它们之间的差异并写入输出文件:
文件-1:
abc1234
def4321
ghi1234
文件2:
ghi1234
jk16754
abc1234
mnop3847
输出:
def4321
jk16754
mnop3847
答案1
$ join -v 1 -v 2 <( sort file-1 ) <( sort file-2 )
def4321
jk16754
mnop3847
join
对其排序的输入文件执行关系 JOIN 操作(使用每个文件中的第一个制表符分隔列,但这可以在命令行上更改,请参阅手册)。它默认输出匹配的数据,但是使用-v 1
and-v 2
我们可以从每个文件中获取匹配的行不是与另一个文件中的匹配。
如果您的 shell 不支持使用 进行进程替换<(...)
,请预先对文件进行排序。如果您计划多次运行该命令或对文件执行其他操作,您可能想要执行此操作。
$ sort -o file-1.sorted file-1
$ sort -o file-2.sorted file-2
$ join -v 1 -v 2 file-[12].sorted
答案2
comm
和的组合sed
可以满足您的需求。
comm
与文件进行比较并输出 3 列。第 1 列是仅在 file1 中的所有行,第 2 列是仅在 file2 中的所有行,第 3 列是公共行。
在您的情况下,您希望禁止打印第 3 列,然后使用 sed 去除第 2 列条目中的空格。
bash-[533]$ comm -3 <(sort file-1) <(sort file-2) | sed -e 's/^\s*//'
def4321
jk16754
mnop3847
comm
确实需要对文件进行排序,上面的示例显示了动态排序的文件,并将输出发送到文件描述符,但是您可以对文件进行预排序,这可能会更容易占用您的系统资源,然后运行命令为:
bash-[533]$ comm -3 file-1-sorted file-2-sorted | sed -e 's/^\s*//'
def4321
jk16754
mnop3847
答案3
和差异命令:
diff --changed-group-format="%>%<" --unchanged-group-format="" <(sort file1) <(sort file2)
输出:
def4321
jk16754
mnop3847