我有一个像这样的大 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,第二个转置行/列,允许具有不同数量字段的行通过并用(空字段)填充缺失值。,
1
collaps
2
tr
\\t
datamash
--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