比較兩個平面檔案 A 和 B,看看 B 中的所有記錄是否也存在於 A 中

比較兩個平面檔案 A 和 B,看看 B 中的所有記錄是否也存在於 A 中

我有兩個平面文件A 和B。鍵。您能否告訴我如何比較 B 和 A,並找出檔案 B 中存在的記錄是否也存在於檔案 A 中,並且在對應列中具有相同的資料。

答案1

我創建了兩個文件來演示我的命令

file1:

1 a1 b1 c1 d1 e1
2 a2 b2 c2 d2 e2
3 a3 b3 c3 d3 e3
4 a4 b4 c4 d4 e4
5 a5 b5 c5 d5 e5

file2:

2 b2 c2 e2
4 b4 c4 xx
5 b5 c5 e5

第一列是唯一鍵。常見的列有bce。常見的行是2,45。 Row4在 column 中具有不同的值e

這是帶有輸出的命令:

$ comm -1 -3 <(cut -d' ' -f1,3,4,6 file1) file2
4 b4 c4 xx

如果文件尚未排序,那麼您可以這樣做:

$ comm -1 -3 <(cut -d' ' -f1,3,4,6 file1 | sort) <(sort file2)

解釋:

cut -d' ' -f1,3,4,6 file1

列印文件中的欄位號 1、3、4 和 6。字段由空格分隔。如果欄位以逗號分隔,則使用cut如下:cut -d','

<( ... )

工藝替代

comm -1 -3 file1 file2

列印 file2 特有的行。

注意事項:

cut如果分隔符號可以作為欄位中的字元出現,則會出現問題。

例如:

"field1","field2,stillfield2","field3"

cut不會理解逗號 in"field2,stillfield2"是字段的一部分。

如果您的檔案是這樣的,那麼也許最好使用具有內建 csv 處理功能的程式語言。例如Python

答案2

如果文件如您所說具有不同的列,最簡單的方法可能是使用您選擇的語言編寫一個小程式。如果文件中的行結構不相同,則不會有太大幫助diffcomm

答案3

除了 和 解決方案之外,commdiff還可以使用grep此解決方案。
假設您的相關資料是檔案 A 中的第 1,3 和 10 列以及檔案 B 中的 1,2 和 3 列cut。在檔案B 中的存在情況如果檔案 B 中有一行不存在於從檔案 A 中提取的符合行中,則會顯示它們。如果全部匹配,則沒有輸出(因為 B 應該是 A 的子集)

grep -wvf <( cut -f1,3,10 fileA ) fileB

或者,如果檔案 B 的列數超過三列:

grep -wvf <( cut -f1,3,10 fileA ) <( cut -f1,2,3 fileB )

相關內容