我想将file1与file2进行比较,并生成一个file3,其中包含file1中不存在于file2中的行。
我想将file1与file2进行比较,并生成一个file3,其中包含file1中不存在于file2中的行。
Answers:
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
所以
comm -2 -3 file1 file2 > file3
输入文件必须排序。如果不是,请先对其进行排序。这可以通过一个临时文件来完成,或者...
comm -2 -3 <(sort file1) <(sort file2) > file3
只要您的Shell支持进程替换(bash可以)。
comm -23
考虑一下:
a.txt文件:
abcd
efgh
文件b.txt:
abcd
您可以通过以下方式找到区别:
diff -a --suppress-common-lines -y a.txt b.txt
输出将是:
efgh
您可以使用以下方法在输出文件(c.txt)中重新分配输出:
diff -a --suppress-common-lines -y a.txt b.txt > c.txt
这将回答您的问题:
“ ...包含file1中不存在于file2中的行。”
-d
,它将尽diff
最大努力找到可能的最小差异。-i
,-E
,-w
,-B
并且--suppress-blank-empty
也可能是有用的偶然,但并非总是如此。如果您不知道什么适合您的用例,请diff --help
首先尝试(当您不知道命令可以做什么时,通常是个好主意)。
有时diff
是您需要的实用程序,但有时join
更合适。这些文件需要预先排序,或者,如果您使用支持进程替换的外壳程序(例如bash,ksh或zsh),则可以即时进行排序。
join -v 1 <(sort file1) <(sort file2)
尝试
sdiff file1 file2
通常,在大多数情况下,它对我来说要好得多。如果行的顺序不重要,则可能需要对文件进行排序(例如,一些文本配置文件)。
例如,
sdiff -w 185 file1.cfg file2.cfg
sdiff <(sort file1) <(sort file2)
)
已经有很多答案,但是没有一个完美的恕我直言。Thanatos的答案在每行中留下了一些额外的字符,Sorpigal的答案要求对文件进行排序或预排序,这可能并不适合所有情况。
我觉得越来越是不同的,并没有别的(没有多余的字符,没有重新排序)行的最好方式是组合diff
,grep
和awk
(或类似)。
如果这些行不包含任何“ <”,则简短的单行代码可以是:
diff urls.txt* | grep "<" | sed 's/< //g'
但这会从行中删除每个“ <”(小于空格)的实例,这并不总是可以的(例如源代码)。最安全的选择是使用awk:
diff urls.txt* | grep "<" | awk '{for (i=2; i<NF; i++) printf $i " "; print $NF}'
这个单线diff比较两个文件,然后过滤掉diff的ed样式输出,然后删除diff添加的尾随“ <”。即使这些行本身包含一些“ <”也可以使用。
diff a1.txt a2.txt | grep '> ' | sed 's/> //' > a3.txt
我尝试了该线程中几乎所有的答案,但没有一个是完整的。经过几步之后,一条路为我工作。diff会给您带来不同,但会有一些不需要的特殊字符。您实际的差异线以“>”开头。所以下一步是grep行以'>'开头,然后用sed删除它们。
<
。如果交换输入文件的顺序,则会看到此信息。即使您执行了此操作,也希望grep
通过使用更多sed 来忽略它:`diff a1 a2 | sed'/> / s ///'`仍然可以中断包含>
或<
在正确情况下的行,并仍然留下多余的行来描述行号。如果您想尝试这种方法,则更好的方法是:diff -C0 a1 a2 | sed -ne '/^[+-] /s/^..//p'
。