如何使用 diff 或任何其他命令来比较两个文本文件

如何使用 diff 或任何其他命令来比较两个文本文件

我有两个大文件(每个 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 1and-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

相关内容