我有一個輸入 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 區塊。
我不提倡這種方法,而是支持吉爾斯接受的答案。我提出它只是為了演示一種替代方法,在處理複雜問題(這不是其中之一)時,可以顯著降低複雜性(以 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