Bash는 CSV 파일의 모든 열을 읽고 각 행에 빈 셀을 표시합니다.

Bash는 CSV 파일의 모든 열을 읽고 각 행에 빈 셀을 표시합니다.

예CSV

각 열을 살펴보고 공백을 확인하고 이를 하나의 열로 그룹화하는 스크립트가 필요합니다. 예를 들어 첫 번째 행은 다음과 같습니다.바나나,두 번째 줄:레이첼,다섯 번째 줄:레이첼, 모니카, 챈들러, 조이, 제니스, 바나나

답변1

이것이 당신에게 얼마나 도움이 되는지 확인해 보세요

awk -F\; '
    {TMP = ""
     for (i=1; i<=NF; i++) if ($i == "") TMP = sprintf ("%s,%c", TMP, 64+i)
     print substr (TMP,2)
    }
' /test1.csv
B,F,H
A,G,H

A,C,F

필요한 경우 필드 구분 기호를 조정합니다. 26열 이후에는 실패합니다.

새로운 요구 사항에 적응

    awk -F\; '
    NR == 1 {MX = split ($0, HDR)
             next
            }
            {TMP = ""
             for (i=1; i<=MX; i++) if ($i == "") TMP = sprintf ("%s,%s", TMP, HDR[i])
             print substr (TMP,2)
            }
    ' file
banana
rachel
banana
rachel,monica,chandler,joey,janice,banana
rachel,monica,chandler,joey,banana

답변2

나는 당신이 다음과 같은 것을 찾고 있다고 생각합니다

awk '
BEGIN { FS=";" }
NR==1 {
        for(i = 1; i <= NF; i++) { heads[i]=$i; }
      }

      { for(i = 1; i <= NF; i++) {
          if ($i == "") { printf "%s ",heads[i] }
        }
        print "";
      } 
'

이렇게 하면 첫 번째 행의 필드가 배열로 분리됩니다 heads. 첫 번째 행이 아닌 각 행에 대해 awk는 열을 반복하고 열 이름을 인쇄합니다(필드가 비어 있는 경우). 하지만 테스트할 시간은 없습니다. 오류가 있을 수 있습니다. 청소년MMV

답변3

또한 다음을 시도해보세요:

BEGIN {FS=OFS=","}
{
    if (NR == 1)
        split($0, hdr)

        if (nr) {nr = 0; print("")}
        for(f=1; f<=NF; f++)
            if ($f == "") {
                if (!nr)
                    printf("%s", hdr[f])
                else
                    printf("%c%s", OFS, hdr[f])
                nr = 1
            }
}

음, 특별한 BANANA 열 구현은 다음과 같습니다.

BEGIN {FS = OFS = ","}

NR == 1 {
        printf("%s%c%s\n", $0, OFS, "BANANA")
        split($0, hdr)
        next
}

{
        for(f = 1; f <= NF; f++)
            if ($f == "") {
                printf("%s%c%s\n", $0, OFS, hdr[f])
                break
            }
}

관련 정보