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