跨連續行組合文字鍵相似?

跨連續行組合文字鍵相似?

我有一個輸入 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

相關內容