3 回答

TA貢獻1824條經驗 獲得超6個贊
所以這里有一個快速的答案,但它不是那么有效:
$ 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
join 命令按鍵匹配兩個已排序文件中的行(默認情況下,鍵是具有默認空間定界符的第一個字段)。但是,上面的命令效率不高,因為我們對文件進行了兩次排序:一次是獲取第一個文件 (-v1) 的唯一值,另一次是獲取第二個文件 (-v2) 的唯一值。我很快就會發布一些改進。
您可以在單個調用中獲取唯一的值,但原始文件會丟失。請參閱下面的代碼:
$ join -v1 -v2 <(sort FileA) <(sort FileB)
650bc1eb1b24604819eb342f2ebc1bab464d9210 /home/user/third.txt
e0f886f2124804b87a81defdc38ad2b492458f34 /home/user/second.txt
在這一點上,我們幾乎有了答案。我們擁有兩個文件中所有不匹配的文件。此外,我們只對每個文件進行了一次排序。我相信這是有效的。但是,您丟失了“原點”信息。我們可以使用此迭代或代碼用 sed 標記行:
$ 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
此時,我們有唯一的條目,我們知道它們來自哪個文件。如果您必須在單獨的文件中獲得結果,我想您可以使用awk(或只是更多的bash)來完成此操作。下面是包含 awk 的代碼的又一次迭代:
join -v1 -v2 <(sort FileA | sed s/$/\ A/ ) <(sort FileB | sed s/$/\ B/ ) | awk '{ file="Unique" $3 ; print $1,$2 > file }

TA貢獻1789條經驗 獲得超10個贊
一個只有bash的解決方案:
# create a file with a mark that help to find the source of the hash remove duplicate
sed 's/^\([0-9a-f]*\)[^0-9a-f]/\1=A=/' FileA | sort | uniq -w 32 > FileA.mark
sed 's/^\([0-9a-f]*\)[^0-9a-f]/\1=B=/' FileB | sort | uniq -w 32 > FileB.mark
# sort the 2 files together , keep only unique hashs
sort -t= FileA.mark FileB.mark | uniq -w 32 -c > HashCountFromAB
# if the count equal 1 ( provide by option -c from uniq )
# we use the mark to find the origin of the hash
grep '^ *1 [0-9a-f]*=A=' HashCountFromAB > FileA.uniq
grep '^ *1 [0-9a-f]*=B=' HashCountFromAB > FileB.uniq
添加回答
舉報