我有一堆输入 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
我可以想到两种方法来解决这个问题:
实现您自己的“粘贴”,跳过除第一个文件之外的所有文件的前三个字段 - 例如
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
)。