说我有两个文件:a.txt
和b.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
说明:在cat
将sort
2 个文件放在一起之后,您复制了子集行,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