如何将两个文件的差异写入一个文件

如何将两个文件的差异写入一个文件

说我有两个文件:a.txtb.txt.

内容a.txt

hello world

内容b.txt

hello world
something else

当然,我可以用来vimdiff检查它们的差异,我可以确保 是a.txt的子集b.txt,这意味着b.txt必须包含 中存在的所有行a.txt(就像上面的示例一样)。

我的问题是如何将存在b.txt但不存在的行记录a.txt到文件中?

答案1

comm -1 -3 a.txt b.txt > c.txt

排除-1仅在 中的行a.txt,而-3排除在两者中的行。因此,仅b.txt输出in 中的行(详细信息请参见man comm或)。comm --help输出被重定向到c.txt

如果您想要两个文件之间的差异,请使用diff而不是comm.例如

diff -u a.txt b.txt > c.txt

答案2

如果你不关心子集,你可以只使用

diff a.txt b.txt|grep ">"|cut -c 3- > foo.txt

$ cat a.txt
hello world
$ cat b.txt
hello world
something else
$ diff a.txt b.txt|grep ">"|cut -c 3- > foo.txt
$ cat foo.txt
something else

答案3

局限性:这不是真正的文件差异,更像是一组行差异(但您可能确实需要这个)。

a.txt和之间的所有差异b.txt

sort a.txt b.txt | uniq -u > c.txt

缺少的行a.txt(忽略缺少的行b.txt):

sort a.txt a.txt b.txt | uniq -u > c.txt

说明:在catsort2 个文件放在一起之后,您复制了子集行,uniq -u仅显示 uniq 行,这些行仅存在于其中一个文件中。复制输入之一(a.txt上面)会抑制输出中该文件中存在的所有行。

任何文件中的重复都会破坏上述命令的输出,如果文件中有重复项,则必须先删除这些重复项,然后在新创建的文件上运行上述命令:

sort a.txt | uniq | aa.txt
sort b.txt | uniq | bb.txt

您可以检查结果,这两个命令应该给您相同的校验和:

sort b.txt c.txt | uniq | sha256sum
sort a.txt c.txt | uniq | sha256sum

如果其中一个文件是另一个文件的超集(因此它包含另一个文件的所有行加上(也许)更多),那么您可以稍微简化一下。就像在您的示例中一样,它b.txt是超集,因此这两个命令也应该为您提供相同的校验和:

sort b.txt | sha256sum
sort a.txt c.txt | sha256sum

答案4

b.txt - a.txt : sort a.txt a.txt b.txt | uniq -u > foo.txt

相关内容