2017-04-18 125 views
1

我想按以下方式將兩個csv文件合併成一個文件。 第一個文件:包含所有數據。 第二個文件:包含數據更新。在Linux中合​​並兩個csv文件

所以導致文件應包含通過第二個文件中的數據修改的行中的所有數據..

例如:

file1: 
1,Hello,123 
2,Hello,456 
3,Bye,789 

file2: 
1,Hello,123 
3,Hello,789 
4,Bye,345 

resulted file: 
1,Hello,123 
2,Hello,456 
3,Hello,789 
4,Bye,345 

所有新條目應該添加,沒有舊條目應該被刪除,所有更新應該在結果中更新條目。

我正在尋找一些簡單的解決方案,通過一些shell腳本。

在此先感謝。 :)

+0

你缺少新行嗎? – kabanus

+0

缺少換行符?如果需要,我可以添加它在預處理文件 –

+0

NM,有人編輯你的問題。請注意他們做了什麼 - 這應該是這樣。也是任何語言OK或只是bash/csh? – kabanus

回答

0

假設這些文件中的第一個元素是關鍵,你可以用awk這樣做:

解析。AWK

BEGIN { FS = OFS = "," } 

FNR == NR { 
    h[$1] = $0 
    next 
} 

{ h[$1] = $0 } 

END { 
    for(k in h) 
    print h[k] 
} 

這樣運行:

awk -f parse.awk file1 file2 

或者作爲一襯墊:

awk 'FNR==NR{h[$1]=$0;next} {h[$1]=$0}END{for(k in h)print h[k]}' FS=, OFS=, file1 file2 

輸出在這兩種情況下:

1,Hello,123 
2,Hello,456 
3,Hello,789 
4,Bye,345 
+0

感謝Thor @ that works(Y):) –

0

您需要更好地定義術語「數據更新」。

如果你的文件1擁有此行

3,再見,789

和文件2有這些行

3,你好,789

4 ,Bye,345

那麼你需要指定什麼是「更新」。第一個數字是你的數據密鑰?這個詞是關鍵嗎?案件重要嗎?你最後一個號碼是你的鑰匙嗎?

然後指定

沒有舊條目應該被刪除

但結果文件不包括線

3,再見,789

很顯然你期望數據被刪除。

一旦你更好地定義了你的標準,那麼你就可以開始編程一個解決方案。

+0

第一個數字是我的鑰匙。 如果密鑰存在於第二個文件中,則應更新舊條目。 這些文件,結果應該是這樣的: 3,你好,789 4,再見,345 (3既文件中,第二文件數據應該存在於最終的結果在這種情況下) –

+0

這ISN」答案是,你應該將其轉移到我認爲的評論中。 – kabanus

0

一個bash溶液假設變量爲res不存在:

for f in file1 file2; do 
    while read line; do 
     res[${line%%,*}]=$line; 
    done < $f 
done 

該數組現在包含您想要的。如果你想現在在一個文件中:

for x in ${res[*]}; do echo $x; done > resultFile 
+0

評論 - 如果重要的話,整個事情可以寫在一行,如果你需要它在一個shell。 – kabanus