粘贴不同的csv文件

粘贴不同的csv文件

我有一堆输入 csv 文件(用分号“ ;”分隔,格式如下

YEAR;MONTH;DAY;RES1FILE1;RES2FILE1;RES3FILE1
1901;01;01;101;154;169
1901;01;02;146;174;136

每个文件的列数是可变的,这意味着某些文件可能有 6 列,而另一些文件可能有 4 列。

我想将每个文件粘贴到一个大的 csv 文件中(以“ ;”作为分隔符。我的问题是,为了避免冗余,我想避免每次粘贴前三列,因为对于每个文件来说,它们都是相同的 (YEAR;MONTH;DAY)。

因此,输出应该如下所示:

YEAR;MONTH;DAY;RES1FILE1;RES2FILE1;RES3FILE1;RES1FILE2;RES2FILE2
1901;01;01;101;154;169;185;165
1901;01;02;146;174;136;129;176

我目前正在使用以下命令:

arr=( *_rcp8p5.csv )
paste "${arr[@]}" | cut -f-4,$(seq -s, 8 4 $((4*${#arr[@]}))) >out_rcp8p5.txt

但它根本不起作用

答案1

我可以想到两种方法来解决这个问题:

  1. 实现您自己的“粘贴”,跳过除第一个文件之外的所有文件的前三个字段 - 例如

    awk -F\; '
      FNR==NR {
        a[FNR]=$0; next;
      }
      {
        for (i=4;i<=NF;i++) a[FNR] = sprintf("%s;%s", a[FNR], $i);
      } 
      END {
        for (n=1;n<=FNR;n++) print a[n];
      }' file*.csv
    
  2. 将文件粘贴在一起,然后根据从标题行派生的指示符保留字段

    paste -d\; file*.csv | 
      perl -MList::MoreUtils=indexes -F\; -alne '
        @keep = indexes { $_ !~ /YEAR|MONTH|DAY/ } @F if $. == 1; 
        print join ";", @F[0..2,@keep]'
    

    (如果您没有该List::MoreUtils模块,您应该能够使用 perl 实现相同的功能grep)。

相关内容