동일한 키로 입력된 연속 줄의 텍스트를 결합하시겠습니까?

동일한 키로 입력된 연속 줄의 텍스트를 결합하시겠습니까?

다음과 같은 입력 CSV 파일이 있습니다.

john,Hello my name
john,is John
katie,Whereas my
katie,name is Katie
bob,And I am Bob.

파일은 이름(첫 번째 열)이 연속되고 텍스트(두 번째 열)가 논리적으로 정렬되도록 정렬됩니다.

첫 번째 열을 "그룹화"(SQL 용어 사용)하고 두 번째 열을 연결하는 표준화된 방법이 있습니까?

내가 원하는 출력은 다음과 같습니다.

john,Hello my name is John
katie,Whereas my name is Katie
bob,And I am Bob.

답변1

각 블록의 길이에 대한 고급 지식을 통해 복제된 기능의 END 블록이 필요한 경계 조건을 처리하는 사소한 복잡성을 피할 수 있습니다.

나는 Gilles가 받아들인 답변을 지지하여 이 접근 방식을 옹호하지 않습니다. 나는 단지 복잡한 문제를 처리할 때(이것은 그 문제 중 하나가 아님) 복잡성을 크게 줄일 수 있는(I/O 및 메모리 비용을 희생하여) 대체 접근 방식을 보여주기 위해 제시할 뿐입니다.

a블록 길이의 이름 인덱스 배열입니다. n블록에 남아 있는 줄의 수입니다.

awk -F, '
    FNR==NR  {a[$1]++; next}
          n  {print " "$2}
         !n  {print; n=a[$1]}
       !--n  {print "\n"}
' ORS= data data

답변2

이를 위한 표준 도구는 없습니다. 이 작업은 awk에 매우 적합합니다. 행을 하나씩 읽고, 첫 번째 필드를 저장하고 두 번째 필드를 누적하고, 첫 번째 필드가 변경되면 결과를 인쇄합니다. 주요(사소한) 어려움은 마지막 줄에 도달하면 결과도 인쇄해야 한다는 것입니다.

awk -F, '
    1 {current = $1; sub(/^[^,]*,/,"")}
    current == previous {acc = acc " " $0; next}
    NR != 1 {print previous "," acc}
    1 {previous = current; acc = $0}
    END {if (NR) print previous "," acc}'

답변3

awk -F, '{a[$1]=a[$1]? a[$1]" "$2 : $2;}END{for (i in a)print i, a[i];}' OFS=, filename

관련 정보