2015-04-01 92 views
1

我已經問過類似的問題,但沒有找到我正在尋找的確切答案,我爲冗餘道歉。我決定以不同的方式重新發布這個問題。我有兩個冗長的文件,每個文件都有一個空格分隔的兩列。逐行比較兩個文件的單列

我想消除具有在的fileA和FILEB匹配塔2(不管行數/列1),並輸出整個失配線到一個單獨的文件中的所有行。

文件:

1 AA 
2 BB 
3 CC 
4 DD 
5 EE 
6 FF 
7 GG 
8 HH 

文件B:

1 AA 
2 BB 
3 XX 
4 XX 
5 CC 
6 DD 
7 XX 
8 FF 
9 GG 
10 XX 
11 XX 
12 HH 

希望的輸出:

3 XX 
4 XX 
7 XX 
5 EE 
10 XX 
11 XX 

fedorqui建議我用awk的fileA的第二列存儲在數組中,然後通過fileB循環輸出符合以下條件的行:

  1. 塔1是存在於FILEB的fileA
  2. 但第2欄是不同

    awk 'FNR==NR {a[$1]=$2; next} $1 in a && a[$1] != $2' fileA fileB 
    

這是有幫助的,直到我的代碼遇到的fileA和FILEB之間在列2中的第一差異,那麼代碼將輸出所有以下行。

取而代之的是,我想到陣列從的fileA線由行第2列比較FILEB的第2列。一旦代碼遇到差異,它將從fileB輸出整個不匹配的行,然後將該數組的相同行與fileB的下一行進行比較。它繼續比較數組的相同行,輸出fileB的差異行直到找到匹配。如果代碼到達fileB的末尾並且找不到匹配,則從fileA輸出該行,移至該數組的下一行並繼續與fileB的每一行進行比較。這是可能的,或者比使用awk創建數組更容易嗎?

回答

1

您可以使用此awk:不如圖問題

awk 'NR==FNR {a[$2]=$0;next} $2 in a{del[$2];next} 1; 
    END{for (i in a) if (!(i in del)) print a[i]}' fileA fileB 
3 XX 
4 XX 
7 XX 
10 XX 
11 XX 
5 EE 

注意順序,因爲(fileA - fileB)印到底,同時(fileB - fileA)在遍歷fileB計算。

+0

這讓我更親近,謝謝。然而,當我在我的真實fileA和fileB上運行這個時,我注意到有很多行在輸出中出現fileA和fileB之間沒有差異。許多這些行是重複的同一個字母(例如,CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC和################################## ##)。你知道爲什麼會發生這種情況嗎? – agrobins 2015-04-02 04:24:29

+0

如果您從這兩個文件中提供新的示例數據,那麼我當然可以研究並提出修復建議。 – anubhava 2015-04-02 05:02:36

+0

謝謝anubhava,fileA例如: – agrobins 2015-04-02 14:40:19