按第一列分组

Sur*_*kla 2 text-processing

有一个具有以下模式的文件

a 12
a 13
a 15
a 14
b 5
b 6
c 2
c 5
Run Code Online (Sandbox Code Playgroud)

我想根据第一列对它们进行分组,如下所示

a 12 13 15 14
b 5 6
c 2 5
Run Code Online (Sandbox Code Playgroud)

请建议

Kus*_*nda 8

假设数据按第一列排序(如问题中所示),使用 GNUdatamash按第一个空格分隔列进行分组并折叠第二列。

$ datamash -W groupby 1 collapse 2 <file
a       12,13,15,14
b       5,6
c       2,5
Run Code Online (Sandbox Code Playgroud)

将结果中第一列后面的制表符以及逗号替换为空格,以得到所需的输出:

$ datamash -W groupby 1 collapse 2 <file | tr '\t,' '  '
a 12 13 15 14
b 5 6
c 2 5
Run Code Online (Sandbox Code Playgroud)

如果输入未按第一列排序,则sort首先传递数据,或datamash与其-s( --sort) 选项一起使用。


您还可以使用Miller ( mlr)及其nest运算。使用此功能,您可以将第二列中的值“内爆”到第一列中每个唯一值的空格分隔列表中:

$ mlr --nidx nest --implode --values --across-records --nested-fs space -f 2 file
a 12 13 15 14
b 5 6
c 2 5
Run Code Online (Sandbox Code Playgroud)

或者,使用--ivarmiller 5.5.0 或更高版本的简写(除了在 6.0.0 中它被破坏):

$ mlr --nidx nest --ivar space -f 2 file
a 12 13 15 14
b 5 6
c 2 5
Run Code Online (Sandbox Code Playgroud)

数据不需要预先排序。