我有一堆输入的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
但这根本没有用
我可以想到两种方法来解决此问题:
实现自己的“粘贴”,跳过除第一个文件以外的所有前三个字段-例如
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
)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句