Linux - 将多个CSV文件合并为一个

时间:2013-08-29 13:33:44

标签: linux join csv

我正在尝试将存储在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

file2的:

          header1   header2  header3
result_B  40         41       42
result_F  43         44       45

file3的:

          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

2 个答案:

答案 0 :(得分: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)

(全部在一条线上)。请注意,"-t "的引号中的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实用程序中发现了这样一个重要的错误。

答案 1 :(得分:1)

来自image 2

csvjoin也应该有效。