다른 CSV 파일 붙여넣기

다른 CSV 파일 붙여넣기

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

이 문제를 해결하는 두 가지 방법을 생각해 볼 수 있습니다.

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

관련 정보