长到宽格式

时间:2020-02-01 21:47:03

标签: bash parsing variables awk format

在bash中(也许使用awk),我想将长格式的表转换为宽表。为简单起见:

输入:

A one
A two
A three
B seven
B eight
B nine

输出:

A one,two,three
B seven,eight,nine

1 个答案:

答案 0 :(得分:1)

一种使用GNU datamash的方式:

$ datamash -W -g1 collapse 2 < input.txt
A   one,two,three
B   seven,eight,nine

(这确实要求文件像您的示例一样在第一列上进行排序。否则,请在选项中添加-s。)

使用perl的另一种方法比awk支持更复杂的数据结构,从而使存储项目列表更加容易:

$ perl -lane 'push @{$groups{$F[0]}}, $F[1];
              END { $" = ",";
                    for $g (sort keys %groups) { print "$g\t@{$groups{$g}}" }}' input.txt
A   one,two,three
B   seven,eight,nine

(不需要排序的输入)