입력 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
).