逐行比较两个文件并在另一个文件中生成差异

Bal*_*ays 113 unix shell

我想比较file1和file2并生成一个file3,其中包含file1中不存在的file1中的行.

Sor*_*gal 204

diff(1)不是答案,但comm(1)是.

NAME
       comm - compare two sorted files line by line

SYNOPSIS
       comm [OPTION]... FILE1 FILE2

...

       -1     suppress lines unique to FILE1

       -2     suppress lines unique to FILE2

       -3     suppress lines that appear in both files
Run Code Online (Sandbox Code Playgroud)

所以

comm -2 -3 file1 file2 > file3
Run Code Online (Sandbox Code Playgroud)

必须对输入文件进行排序.如果不是,请先排序.这可以使用临时文件来完成,或者......

comm -2 -3 <(sort file1) <(sort file2) > file3
Run Code Online (Sandbox Code Playgroud)

只要你的shell支持进程替换(bash).

  • 您可以将选项组合在一起:`comm -23` (6认同)
  • 请记住,两个文件必须已排序并且是唯一的 (2认同)

Tha*_*tos 47

Unix实用程序diff就是为了这个目的.

$ diff -u file1 file2 > file3
Run Code Online (Sandbox Code Playgroud)

有关选项,不同的输出格式等,请参阅手册和Internet.

  • 那不是要求的工作; 即使使用其他答案中建议的命令行开关,它也会插入一堆额外的字符. (7认同)

Nei*_*val 20

考虑一下:
文件a.txt:

abcd
efgh
Run Code Online (Sandbox Code Playgroud)

文件b.txt:

abcd
Run Code Online (Sandbox Code Playgroud)

您可以找到与以下区别:

diff -a --suppress-common-lines -y a.txt b.txt
Run Code Online (Sandbox Code Playgroud)

输出将是:

efgh 
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令在输出文件(c.txt)中重新映射输出:

diff -a --suppress-common-lines -y a.txt b.txt > c.txt
Run Code Online (Sandbox Code Playgroud)

这将回答你的问题:

"...包含file1中不存在于file2中的行."

  • 这个答案有两个限制:(1)它只适用于短线(默认情况下少于80个字符,虽然可以修改),更重要的是,(2)它在每个字符串末尾添加"<"必须用另一个程序(例如awk,sed)带走的行. (2认同)

Pau*_*ce. 8

有时diff是您需要的实用程序,但有时join更合适.这些文件需要预先排序,或者如果您使用支持进程替换的shell(如bash,ksh或zsh),则可以动态进行排序.

join -v 1 <(sort file1) <(sort file2)
Run Code Online (Sandbox Code Playgroud)


αғs*_*нιη 7

然而,没有grep解决方案?


Tag*_*gar 5

尝试

sdiff file1 file2
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,它通常对我来说效果更好.如果行的顺序不重要(例如某些文本配置文件),您可能希望先排序文件.

例如,

sdiff -w 185 file1.cfg file2.cfg
Run Code Online (Sandbox Code Playgroud)