跨连续行组合文本键相似?

跨连续行组合文本键相似?

我有一个输入 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

相关内容