別のCSVファイルを貼り付ける

別のCSVファイルを貼り付ける

入力csvファイルが複数あります(;次の形式のセミコロン ""で区切られています)。

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

ファイルごとの列数は可変です。つまり、一部のファイルには6つの列があり、他のファイルには4つの列がある可能性があります。

各ファイルを大きなcsvファイル(" "区切り文字で貼り付けたいのですが、;私の問題は、重複を避けるために毎回最初の3つの列を貼り付けることを避けたいということです。各ファイルはすべて同じです。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

この問題を解決する2つの方法を考えることができます。

  1. 最初のファイルを除くすべてのフィールドの最初の3つのフィールドをスキップする独自の「貼り付け」を実装します。

    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::MoreUtilsperlを使用して同じ機能を達成できるはずですgrep)。

関連情報