awk를 사용하여 여러 열을 기반으로 csv 파일의 여러 열을 전치

awk를 사용하여 여러 열을 기반으로 csv 파일의 여러 열을 전치

이전 태그에서는 awk 일반 코드를 사용하여 csv 열을 유지하겠습니다. 답변이 제공되었습니다.여기작성자: @steeldriver.

다음으로 csv 파일의 일부 열을 전치하여 새 열을 얻고 싶습니다.

데이터에 대한 설명은 다음과 같습니다.

  1. 입력에서 첫 번째 줄에는 국가(여러 필드가 비어 있음)가 포함되고 두 번째 줄에는 처리할 제목이 포함됩니다.

  2. 전치된 열은 국가를 기준으로 마지막 빈 열로 시작됩니다. 국가마다 열 개수가 다른 것은 아닙니다. 2개 또는 20개의 국가 열이 있을 수 있습니다.

예:

  • 입력하다:file.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
    
  • 산출:file1.csv
    num,nom,date reg,match flag,country
    0001,AA ,2020-05-15,reg1_fr,fr      
    0002,AAA,2020-05-20,   _fr,fr       
    0001,AA ,2020-05-15,reg2_ch,ch
    0002,AAA,2020-05-20,reg3_ch,ch
    

나는 다음을 사용했다암호, 결과는 정확하지만 모든 다른 필드를 수동으로 선언해야 합니다. 예:

awk -F, '
    BEGIN{OFS=FS} 
    NR==2{n = split($0,a); print "num,nom,date reg,match country,flag"; next}
    {for(i=4;i<=NF;i++) if (a[i] !=""){ print $1,$2,$3,a[i],$i} }
' < file.csv>file1.csv

결과file1.csv

num,nom,date reg,match country,flag
0001,AA,2020-05-15,match flag_fr,reg1_fr
0001,AA,2020-05-15,match flag_ch,reg2_ch
0002,AAA,2020-05-20,match flag_fr,
0002,AAA,2020-05-20,match flag_ch,reg3_ch

가능하다면 일반 awk코드를 사용하여 어떻게 이를 수행할 수 있습니까?

답변1

$ cat tst.awk
BEGIN { FS=OFS="," }
NR==1 {
    for (numHdrs=1; numHdrs<=NF; numHdrs++) {
        if ( $numHdrs != "" ) {
            break
        }
    }
    numHdrs--
    next
}
{
    hdr = ""
    for (i=1; i<=numHdrs; i++) {
        hdr = hdr $i OFS
    }
}
NR == 2 {
    for (i=numHdrs+1; i<=NF; i++) {
        country[i] = $i
    }
    print hdr "match flag", "country"
    next
}
{
    for (i=numHdrs+1; i<=NF; i++) {
        print hdr country[i], $i
    }
}

.

$ awk -f tst.awk file.csv
num,nom,date reg,match flag,country
0001,AA,2020-05-15,match flag_fr,reg1_fr
0001,AA,2020-05-15,match flag_ch,reg2_ch
0002,AAA,2020-05-20,match flag_fr,
0002,AAA,2020-05-20,match flag_ch,reg3_ch

관련 정보