![연속된 줄에 걸쳐 텍스트 키를 결합하는 것이 비슷합니까?](https://linux55.com/image/83644/%EC%97%B0%EC%86%8D%EB%90%9C%20%EC%A4%84%EC%97%90%20%EA%B1%B8%EC%B3%90%20%ED%85%8D%EC%8A%A4%ED%8A%B8%20%ED%82%A4%EB%A5%BC%20%EA%B2%B0%ED%95%A9%ED%95%98%EB%8A%94%20%EA%B2%83%EC%9D%B4%20%EB%B9%84%EC%8A%B7%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
다음과 같은 입력 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