除了滚动自定义解决方案以从命令行将行与列转置之外,我见过的唯一可以做到这一点的工具就是讽刺性的工具transpose
。
安装
不幸的是,它不在任何仓库中,因此您需要下载并编译它。这非常简单,因为它没有依赖的其他库。可以这样完成:
$ gcc transpose.c -o transpose
用法
它可以轻松处理简单的文本文件。例如:
$ cat simple.txt
X column1 column2 column3
row1 0 1 2
row2 3 4 5
row3 6 7 8
row4 9 10 11
可以使用以下命令进行转置:
$ transpose -t --fsep " " simple.txt
X row1 row2 row3 row4
column1 0 3 6 9
column2 1 4 7 10
column3 2 5 8 11
该命令transpose
用于转置(-t
),并且要使用的字段分隔符为空格(--fsep " "
)。
你的例子
由于您的样本数据格式稍微复杂一些,因此需要分两个阶段进行处理。首先,我们需要将其转换为transpose
可以处理的格式。
运行此命令,将以更横向友好的格式放置数据:
$ sed 's/:/ /; /^$/d' sample.txt \
| sort | paste - - - - -
title1 A1 title1 B1 title1 C1 title1 D1 title2 A2
title2 B2 title2 C2 title2 D2 title3 A3 title3 B3
title3 C3 title3 D3 title4 A4 title4 B4 title4 C4
title4 D4 title5 A5 title5 B5 title5 C5 title5 D5
现在,我们只需要除去title1,title2等的次要出现:
$ sed 's/:/ /; /^$/d' sample.txt \
| sort | paste - - - - - | sed 's/\ttitle[0-9] / /g'
title1 A1 B1 C1 D1 A2
title2 B2 C2 D2 A3 B3
title3 C3 D3 A4 B4 C4
title4 D4 A5 B5 C5 D5
现在采用了transpose
可以处理的格式。以下命令将完成整个移调:
$ sed 's/:/ /; /^$/d' sample.txt \
| sort | paste - - - - - | sed 's/\ttitle[0-9] / /g' \
| transpose -t --fsep " "
title1 title2 title3 title4
A1 B2 C3 D4
B1 C2 D3 A5
C1 D2 A4 B5
D1 A3 B4 C5
A2 B3 C4 D5