2013-09-24 42 views
1

我有兩個文件,我想加入/合併基於列1和2. 他們看起來像這樣,「文件1」比文件短得多2,我想找到這兩個文件的交集: ,如果記錄不匹配,最後一列需要用不同的字符串更新。下面正確加入兩個文件基於共同的2列:

例如:

文件1:

1047 510 75 Live 
1048 510 75 Live 
1049 510 75 Live 
1627 510 75 Live 
1628 510 75 Live 
1629 510 75 Live 

文件2:

1047 510 75 Live 
1048 510 75 Live 
1049 510 75 Live 
107  510 39 Live 
108  510 39 Live 
109  510 39 Live 
117  510 39 Live 
118  510 39 Live 
119  510 39 Live 
1627 510 75 Live 
1628 510 75 Live 
1629 510 75 Live 
17  510 75 Live 

目的:文件3種

1047 510 75 Live 
1048 510 75 Live 
1049 510 75 Live 
107  510 39 Test 
108  510 39 Test 
109  510 39 Test 
117  510 39 Test 
118  510 39 Test 
119  510 39 Test 
1627 510 75 Live 
1628 510 75 Live 
1629 510 75 Live 
17  510 75 Test 
+0

如果在上面的第二個文件中存在'1047 510 39 Live',輸出應該如何?它應該是來自file1的行,還是來自file2的行,或者兩行或其他內容? –

+0

@Imran - 歡迎來到SO!到目前爲止你想做什麼?如果你沒有說明你自己做了什麼樣的嘗試,你可能得不到多少幫助。 – Derek

+0

文件1和文件2:每個文件的前2列都是主鍵,應該用來比較這兩個文件。將文件2的記錄與文件1進行比較。如果記錄存在於文件1中,則將文件2中的記錄替換爲文件1中找到的記錄。如果在文件1中找不到記錄,則僅更新文件2中該記錄的最後一列。我希望它很清楚。 – Imran

回答

4

兩種方法。

使用comm得到工會和區別:

{ 
    # lines in common 
    comm -12 <(sort file1) <(sort file2) 
    # lines only in file2 
    comm -13 <(sort file1) <(sort file2) | awk '{$NF="Test"} 1' 
} > file3 

或者,只要堅持使用awk

awk ' 
    # read and store file1 
    NR==FNR {f1[$0]; next} 
    # for file2 lines not in file1, alter the last field 
    !($0 in f1) {$NF = "Test"} 
    # print each line 
    1 
' file1 file2 > file3 

可以通過管道通過column -t輸出美化文件3:

awk '...' file1 file2 | column -t > file3 
+0

嗨Glenn。感謝您的回覆。我的問題有點複雜。 我有兩個文件: 文件1和文件2 每個文件的前2列是主鍵,應該用來比較這兩個文件。 將文件2的記錄與文件1進行比較。 如果記錄存在於文件1中,則將文件2中的記錄替換爲文件1中找到的記錄 如果在文件1中找不到記錄,則只更新該記錄的最後一列在文件2中。 我希望它很清楚。 – Imran

+0

請在問題中添加其他要求。 –

0

這可能適用於你(GNU sed):

sed -r 's|^(\S+\s+\S+\s+).*|/^\1/s/.*/&/;t|;$a\s/\\S+$/Test/' file1 | 
sed -rf - file2 >file3 

這將從file1生成一個sed腳本,它將file2中與file1的前兩個字段匹配的行與來自file1的匹配行的內容替換。那些不匹配的行用Test更新不匹配行的最後一列。結果被打印到file3。

相關問題