연속된 줄에 걸쳐 텍스트 키를 결합하는 것이 비슷합니까?

연속된 줄에 걸쳐 텍스트 키를 결합하는 것이 비슷합니까?

다음과 같은 입력 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 블록을 복사해야 하는 경계 조건의 작은 복잡성을 처리할 필요가 없습니다.

나는 이 접근 방식을 옹호하는 것이 아니라 Giles가 수락한 답변을 찬성하는 것입니다. 복잡한 문제를 처리할 때 복잡성(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

관련 정보