다음과 같은 입력 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