한 열의 값을 검색하고 파일의 다른 열에서 연결된 값을 검색합니다.

한 열의 값을 검색하고 파일의 다른 열에서 연결된 값을 검색합니다.

4개의 열이 있는 텍스트 파일이 있고 데이터는 다음과 같습니다.

P_ID         C_ID         Code         MSG
10            12          001         abcd
20            21          003         jklm
10            12          002         hijk

여기서 P_ID, C_ID, 코드 및 MSG는 열입니다.

C_ID 열에 대해 검색을 수행해야 합니다. 동일한 C_ID 값에 대해 여러 항목이 있지만 코드 및 msg 열 값이 다른 경우 최종 파일에는 아래 예상 출력 파일에 표시된 대로 결과가 있어야 합니다. 여기서 코드 및 msg 열 값은 쉼표로 구분되어 한 줄로 연결됩니다.

예상 출력은 다음과 유사해야 합니다.

P_ID          C_ID         Code          MSG
10             12         001,002        abcd,hijk
20             21         003            jklm

출력은 다음과 같습니다.

1: NF=4
   $1=[P_ID]
   $2=[C_ID]
   $3=[Code]
   $4=[MSG]
2: NF=4
   $1=[10]
   $2=[12]
   $3=[001]
   $4=[abcd]
3: NF=4
   $1=[20]
   $2=[21]
   $3=[003]
   $4=[jklm]
4: NF=4
   $1=[10]
   $2=[12]
   $3=[002]
   $4=[hijk]

첫 번째 답변에 제공된 솔루션의 결과는 다음과 같습니다.

P_ID    C_ID    Code    MSG
10      12      001     abcd
20             21         003            jklm
10             12         002            hijk

컬럼 이름과 해당 데이터를 확인하는 awk 명령은 잘 작동하지만, 답변으로 제공되는 첫 번째 명령은 예상한 결과를 제공하지 않습니다.

답변1

문제가 명확해지면 개선이 필요할 수 있지만, 현재 상태를 기준으로

awk '
    BEGIN   { unique_vals = 0 }
    NR == 1 { print }
    NR > 1  {
                if (seen[$2] == "") {
                        i = seen[$2] = unique_vals++
                        P_ID[i] = $1
                        C_ID[i] = $2
                        Code[i] = $3
                        MSG[i]  = $4
                } else {
                        i = seen[$2]
                        Code[i] = Code[i] "," $3
                        MSG[i]  = MSG[i]  "," $4
                }
            }
    END     {
                for (i=0; i<unique_vals; i++) {
                        printf "%-15s%-11s%-15s%s\n", P_ID[i], C_ID[i], Code[i], MSG[i]
                }
            }
    ' file

일을 하는 것 같습니다.


좋아, 나는 당신이 달리는 방법을 알고 있다고 가정합니다 awk. 그렇지 않다면 그렇게 말하세요. 이렇게 하려면 다음 디버그 스크립트를 실행하세요.

awk '
    {
        print NR ": NF=" NF
        print "   $1=[" $1 "]"
        print "   $2=[" $2 "]"
        print "   $3=[" $3 "]"
        print "   $4=[" $4 "]"
    }
    ' file

입력 파일에 추가하고 질문에 출력을 게시하세요. ("코드 펜스"를 사용하세요 ```.) 그런 다음 여기에 또 다른 댓글을 남겨서 완료했음을 알려주세요.

관련 정보