헤더 행과 열의 조건에 따라 csv 파일의 열을 유지합니다.

헤더 행과 열의 조건에 따라 csv 파일의 열을 유지합니다.

헤더 행의 구조를 기반으로 CSV 파일의 특정 열만 유지하고 싶습니다.

데이터는 다음을 보여줍니다:

  1. 헤더 행(국가 필드)에서여러 필드가 비어 있습니다.
  2. 열 수는 국가마다 다릅니다. 각 국가에는 3개의 열 또는 10개의 열이 있을 수 있습니다.
  3. 헤더 행의 열 수(필드가 비어 있지 않은 곳부터 시작)는 동적입니다. 2개의 열 또는 100개의 열을 가질 수 있습니다.

국가가 최전선에 존재한다면 각 국가의 첫 번째 필드를 유지하는 것이 목표입니다. 어떻게 해야 달성할 수 있나요 awk? 예는 다음과 같습니다.

  • 입력: file.csv
    ,,,fr,fr,fr,ch,ch,ch
    num,nom,date reg,match flag,date1,date2,match flag,date1,date2
    0001,AA,2020-05-15,reg1,2019-02-03,2019-02-05,reg2,2019-05-06,2019-06-10
    0002,AAA,2020-05-20,,,,reg3,2020-05-06,2020-06-10
    
  • 원하는 출력: file1.csv
    ,,,fr,ch
    num,nom,date reg,match flag_fr,match flag_ch
    0001,AA,2020-05-15,reg1_fr,reg2_ch
    0002,AAA,2020-05-20,,reg3_ch
    

도움을 주신 네 분 모두에게 감사드립니다.

답변1

첫 번째 레코드의 필드를 반복하고 조건부로 해당 인덱스를 목록에 추가한 다음 각 레코드의 필드를 반복하고 해당 목록에 인덱스가 있는 필드를 인쇄해야 합니다.

전임자.

$ awk -F, '
  BEGIN {OFS=FS}
  NR==1 {
    for(i=1;i<=NF;i++) if($i=="" || !seen[$i]++){inds[i]=1; lasti = i}
  }
  {
    for(i=1;i<=NF;i++) if(inds[i]) printf "%s%s", $i, i==lasti ? ORS : OFS
  }
' file.csv
,,,fr,ch
num,nom,date reg,match flag,match flag
0001,AA,2020-05-15,reg1,reg2
0002,AAA,2020-05-20,,reg3

관련 정보