按列排列数据

按列排列数据

我有一个像这样的大 data.txt 文件:

6712,04444
6712,02344
6712,02220
6712,02233
5322,00040
5322,02230
5322,42002
4444,03342
4444,03323
11,42023
11,00000
11,23443
11,23232

然后我想从原始数据中创建一个像这样的 data.txt :

col6712  col5322  col4444   col11
04444     00040    03342    42023
02344     02230    03323    00000
02220     42002             23443 
02233                       23232

事实上,我希望原始文件的第一列是列号,原始文件中每行的内部位于其相关列的下方。 Linux 中有什么命令可以实现我的目标吗?

答案1

gnu datamash:

datamash -t, -s -g 1 collapse 2 <data.txt | tr , \\t | datamash --no-strict --filler '' transpose

由于datamash需要排序输入,因此输出将是:

11      4444    5322    6712
42023   03342   00040   04444
00000   03323   02230   02344
23443           42002   02220
23232                   02233

工作原理:
第一个对st 字段分隔的输入进行datamash s排序和g分组,将nd 列中与第一列中的唯一值相对应的值(放入逗号分隔列表中) 。然后所有逗号都被翻译为abs,第二个转置行/列,允许具有不同数量字段的行通过并用(空字段)填充缺失值。,1collaps2tr\\tdatamash--no-strict''


作为旁注,示例输入中的行已按第一个字段分组并按相反顺序排序,因此,要实际获得相同的顺序,您可以在管道到第二个字段之前重新排序,datamash例如

datamash -t, -s -g 1 collapse 2 <data.txt | tr , \\t | \
sort -k1nr | datamash --no-strict --filler '' transpose

产生所需的输出:

6712    5322    4444    11
04444   00040   03342   42023
02344   02230   03323   00000
02220   42002           23443
02233                   23232

相关内容