AWK를 사용하여 csv 파일의 단일 키에 해당하는 여러 값을 그룹화합니다.

AWK를 사용하여 csv 파일의 단일 키에 해당하는 여러 값을 그룹화합니다.

단일 키에 해당하는 값을 그룹화할 때 필드가 2개 이상인 csv 형식 파일에서 이 작업을 시도했습니다. 예를 들면 다음과 같습니다.

Keyobject,FieldName,Fieldvalue
1,are you sleeping,yes
1,country of meeting,USA 
2,are you sleeping,' '
2,country of meeting,' '
3,are you sleeping,yes
3,country of meeting,CHINA
4,are you sleeping,yes
4,country of meeting,ITALY

예상 출력:

Keyobject,Are you sleeping,country of meeting
1,yes,USA
2, ,
3,yes,CHINA
4,no,ITALY.

대략적인 아이디어나 스크립트를 제공해 주세요.

답변1

awk -F, '
    NR > 1 {ids[$1]; keys[$2]; value[$1,$2] = $3}
    END { 
        printf "Keyobject"
        for (k in keys)
            printf ",%s", k
        print ""

        for (id in ids) {
            printf id
            for (k in keys)
                printf ",%s", value[id,k]
            print ""
        }
    }
' file

답변2

또한 시도

awk -F, -v OFS="," '
NR == 1                 {HD      = "Keyobject,are you sleeping,country of meeting"
                         for (MX=n=split (HD, HDArr, OFS); n>0; n--) SRCH[HDArr[n]]
                         print HD
                         next
                        }


$2 in SRCH              {RES[$2] = $3
                         RES[HDArr[1]] = $1
                        }

NR%2                    {for (i=1; i<=MX; i++) printf "%s%s", RES[HDArr[i]], (i == MX)?ORS:OFS
                         split ("", RES)
                        }

' file
Keyobject,are you sleeping,country of meeting
1,yes,USA 
2,' ',' '
3,yes,CHINA
4,yes,ITALY

1행을 읽으면 제목 요소로 색인된 제목과 검색 배열이 생성되고 제목이 인쇄됩니다. 다음 줄에서는 $2로 인덱싱된 결과 배열이 $3에 할당되고 "Keyobject" 인덱스 문자열에 대해 중복됩니다. 한 줄씩 걸러서 결과를 인쇄하고 결과 배열을 삭제합니다.

답변3

awk <file -v IV="' '" -v OV=" " -F, '
        $1+0 {
                b = $2 == IV ? OV : $2
                a[$1,$2] = $3 == IV ? OV : $3
                if($1 > max) max = $1; t[$2]++;
        }
        END{
                ORS = ""
                print "Keyobject"
                for(k in t) print FS k
                print RS
                for(i = 1; i <= max; i++){
                        print i
                        for(k in t)
                                print FS (i SUBSEP k in a ? a[i,k] : OV)
                        print RS
                }
        }
'

IV및 변수를 각각 조정하여 OV입력 및 출력에 포함되어야 하는 빈 필드를 결정합니다.

답변4

csv 파일 이름이 "list.csv"라고 가정합니다. 나는 이렇게 할 것이다:

#!/bin/bash
echo -e "Keyobject","Are you sleeping ", " Country of meeting"   # create new header
cat list.csv | sed 1,1d | awk -F, 'NF>1{print $NF}' | paste -d', ' - - | sed 's/ /,/' | nl


 1  yes,USA 
 2  ' ', ' '
 3  yes,CHINA
 4  yes,ITALY

설명하다:

sed 1,1d # This command excludes the original header in list.csv
awk -F, 'NF>1{print $NF}' # This command reads the last word in each row
paste -d', ' - -  # This command paste the words beside each other 
sed 's/ /,/'  # This command replaces blank spaces with commas
nl # This command adds numbering to the rows in the final output

그러나 이 솔루션에서는 원본 csv 파일의 행이 위 예와 같이 구성되어 있다고 가정합니다.

관련 정보