2013-08-29 155 views
1

我試圖將存儲在CSV文件中的多個結果連接在一起,第一列作爲索引。Linux - 將多個CSV文件合併爲一個

問題是我有各種數量的文件,並且索引結果可能因文件而異,有些結果較少。

在Linux中,腳本化過程將所有文件合併到一個文件中最簡單的方法是什麼,空白字段爲空結果?我遇到過Linux加入,粘貼和列沒有運氣。 Mybe我應該嘗試使用另一種工具,或者Python或Perl?

數據文件是這樣的:

文件1:

  header1 header2 header3 
result_A 10   11  12 
result_B 13   14  15 
result_C 16   17  18 
result_D 19   20  21 
result_E 22   23  24 
result_F 25   26  27 

文件2:

  header1 header2 header3 
result_B 40   41  42 
result_F 43   44  45 

文件3:

  header1 header2 header3 
result_C 60  61  62 
result_D 63  64  65 
result_F 66  67  68 

並希望的結果應該是這樣的:

  file1 file1  file1 file2 file2  file2  file3 file3  file3 
      header1 header2 header3 header1 header2 header3  header1 header2 header3 
result_A 10  11  12               
result_B 13  14  15   40  41  42        
result_C 16  17  18          60  61  62 
result_D 19  20  21          63  64  65 
result_E 22  23  24               
result_F 25  26  27   43  44  45   66  67  68 

回答

1

UNIX join應該讓你很長的路要走:

join -a 1 -e '0' "-t " -j 1 
    <(sort <(join -a 1 -e '0' "-t " -j 1 <(sort file1) <(sort file2))) 
    <(sort file3) 

(全部在同一行)。請注意0​​在引號內有TAB字符。輸入^V<Tab>

如果你知道的輸入進行排序,這將是更好地使用

join -a 1 -e '0' "-t " -j 1 
    <(join -a 1 -e '0' "-t " -j 1 file1 file2) 
    file3 

(全部在一行上)打印:

id  header1 header2 header3 header1 header2 header3 header1 header2 header3 
result_A  10  11  12 
result_B  13  14  15  40  41  42 
result_C  16  17  18  60  61  62 
result_D  19  20  21  63  64  65 
result_E  22  23  24 
result_F  25  26  27  43  44  45  66  67  68 

現在,你可以看到,在我的Cygwin系統-e '0'顯然不能像廣告一樣工作。我建議在不同的系統上嘗試這個,因爲我不認爲在標準UNIX實用程序中發現了這樣一個重要的錯誤。

+0

非常感謝,對於提示鍵入TAB字符,我不知道這一點。 該命令快到了。我在我身邊嘗試過,結果相同:C和D行中的值60,61,62,63,64,65應該在第三列。 由於某些原因,如果缺少一行,它不會創建正確的值。 – zlig

+0

是的。它有點不錯,但是它不會像'[join -e'的手冊頁](http://linux.die.net/man/1/join)中記錄的那樣'替換掉EMPTY輸入字段' 。嗯。這可能是我犯的一個錯誤。 – sehe

+0

在shell中「鍵入」製表符的替代方法是使用printf格式的引用。這適用於bash,一些Almquist衍生物(即破折號)和其他可能的衍生物。使用Ctrl-v轉義標籤,而不是使用'$'\ t''。請注意,這種格式不希望生活在雙引號內。你應該可以像'-t $'\ t''一樣使用它。您可以在[QUOTING]下的bash手冊頁中找到更多信息(https://www.freebsd.org/cgi/man.cgi?query=bash#QUOTING)。我喜歡這種方法,因爲它通過複製和粘貼來保持選項卡,這對於SO答案來說特別好。 :-) – ghoti