入力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つの方法を考えることができます。
最初のファイルを除くすべてのフィールドの最初の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
ファイルを一緒に貼り付け、ヘッダー行から派生したインジケータに基づいてフィールドを保持します。
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
)。