
我有兩個文件:
File1 的內容如下:
1 2 3 4 5 6 7 8 10
File2 的內容如下:
1
2
3
4
5
6
7
8
9
10
我怎麼能找到兩個文件之間的差異並打印出奇數,並說出它來自哪個文件。
例如,在這種情況下9
僅出現在 File2 中,那麼我如何執行命令並取得以下行的輸出
9 is only in File2
答案1
如果您有乾淨的格式(空格 x 換行符),最簡單的方法是將行轉換為行,然後將它們進行比較,如下所示:
diff <( sed -e "s/ /\n/g" h.txt ) v.txt
哪裡h.txt
是橫檔,哪裡v.txt
是豎檔
答案2
您可能會想使用 (G)AWK:
若要尋找差異,請先使用 AWK 將 file1.txt 轉換為逐行表示形式,然後將結果透過管道傳送至 diff:
gawk 'BEGIN {FS = " "} ; {for(i=1; i<=NF; i++) print $i}' file1.txt | diff file2.txt -
答案3
有不只一種方法可以做到這一點;這裡是comm
.
首先是printf
一個頭來解釋comm
的輸出 - 給出請求的檔案名稱 - 然後comm
在排序後的輸入上運行,抑制兩個檔案中都存在的行 ( -3
)。兩個輸入comm
是過程替換,我使用 don_crissti 的tr
建議將空格轉換File1
為換行符;然後將兩個文件傳遞給sort
,這comm
需要。
printf "File1\tFile2\n"; comm -3 <(tr ' ' '\n' < File1 | sort) <(sort File2)
樣品運行
輸入檔1:
1 2 3 4 5 6 7 8 10 11
輸入檔2:
1
2
3
4
5
6
7
8
9
10
輸出:
$ printf "File1\tFile2\n"; comm -3 <(sed 's/ /\n/g' File1 |sort ) <(sort File2)
File1 File2
11
9