转置行和列

转置行和列

我有一个包含如下行的文件。

title1:A1
title2:A2
title3:A3
title4:A4
title5:A5

title1:B1
title2:B2
title3:B3
title4:B4
title5:B5

title1:C1
title2:C2
title3:C3
title4:C4
title5:C5

title1:D1
title2:D2
title3:D3
title4:D4
title5:D5

我怎样才能实现这个目标?

title1    title2     title3    title4
A1         A2         A3         A4
B1         B2         B3         B4
C1         C2         C3         C4
D1         D2         D3         D4

答案1

看一下GNU 数据混合可以像这样使用datamash transpose。未来的版本还将支持交叉表(数据透视表)

答案2

除了滚动自定义解决方案以从命令行转置行与列之外,我见过的唯一可以做到这一点的工具是一个名为讽刺的工具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

答案3

以下是将文件转换为您想要的格式的快速方法:

$ grep -Ev "^$|title5" sample.txt | sed 's/title[0-9]://g' | paste - - - -
A1  A2  A3  A4
B1  B2  B3  B4
C1  C2  C3  C4
D1  D2  D3  D4

如果您想要列标题:

$ grep -Ev "^$|title5" sample.txt | sed 's/:.*//' | sort -u | tr '\n' '\t'; \
    echo ""; \
    grep -Ev "^$|title5" a | sed 's/title[0-9]://g' | paste - - - -
title1  title2  title3  title4  
A1      A2      A3      A4
B1      B2      B3      B4
C1      C2      C3      C4
D1      D2      D3      D4

第二个命令如何工作

打印横幅
grep -Ev "^$|title5" sample.txt | sed 's/:.*//' | sort -u | tr '\n' '\t';
在横幅后添加回车
echo
打印数据行
grep -Ev "^$|title5" a | sed 's/title[0-9]://g' | paste - - - -

答案4

GNU datamash 实用程序

apt install datamash  

datamash transpose < yourfile

摘自该网站,https://www.gnu.org/software/datamash/http://www.thelinuxrain.com/articles/transpose-rows-and-columns-3-methods

相关内容