<p>所以这里有一个简单的答案,但效率不高:</p>
<pre><code>$ join -v1 <(sort FileA) <(sort FileB) | tee UniqueA
e0f886f2124804b87a81defdc38ad2b492458f34 /home/user/second.txt
$ join -v2 <(sort FileA) <(sort FileB) | tee UniqueB
650bc1eb1b24604819eb342f2ebc1bab464d9210 /home/user/third.txt
</code></pre>
<p>join命令按键匹配两个已排序文件中的行(默认情况下,这是第一个具有默认分隔符的字段)。不过,上面的命令并不是很有效,因为我们对文件进行了两次排序:一次是获取第一个文件(-v1)的唯一值,另一次是获取第二个文件(-v2)的唯一值。我很快就会发布一些改进。你知道吗</p>
<p>您可以在一次调用中获得唯一的值,但原始文件将丢失。请参见下面的代码:</p>
<pre><code>$ join -v1 -v2 <(sort FileA) <(sort FileB)
650bc1eb1b24604819eb342f2ebc1bab464d9210 /home/user/third.txt
e0f886f2124804b87a81defdc38ad2b492458f34 /home/user/second.txt
</code></pre>
<p>在这一点上,我们几乎得到了答案。我们有两个文件中所有不匹配的文件。而且,我们只对每个文件进行了一次排序。我相信这是有效的。但是,您丢失了“来源”信息。我们可以使用以下迭代或代码用sed标记行:</p>
<pre><code>$ join -v1 -v2 <(sort FileA | sed s/$/\ A/ ) <(sort FileB | sed s/$/\ B/ )
650bc1eb1b24604819eb342f2ebc1bab464d9210 /home/user/third.txt B
e0f886f2124804b87a81defdc38ad2b492458f34 /home/user/second.txt A
</code></pre>
<p>在这一点上,我们有我们独特的条目,我们知道他们来自的文件。如果您必须将结果放在单独的文件中,我认为您可以使用awk(或更多bash)来完成这一点。下面是包含awk的代码的又一次迭代:</p>
<pre><code>join -v1 -v2 <(sort FileA | sed s/$/\ A/ ) <(sort FileB | sed s/$/\ B/ ) | awk '{ file="Unique" $3 ; print $1,$2 > file }
</code></pre>