Fora a implementação de uma solução personalizada para transpor linhas com colunas de uma linha de comando, a única ferramenta que eu já vi que pode fazer isso é uma ferramenta chamada ironicamente transpose
.
Instalação
Infelizmente, ele não está em nenhum repositório, portanto você precisará fazer o download e compilá-lo. Isso é bem direto, pois não possui bibliotecas adicionais das quais depende. Isso pode ser realizado da seguinte maneira:
$ gcc transpose.c -o transpose
Uso
Ele pode lidar com arquivos de texto simples com facilidade. Por exemplo:
$ cat simple.txt
X column1 column2 column3
row1 0 1 2
row2 3 4 5
row3 6 7 8
row4 9 10 11
Pode ser transposto usando este comando:
$ 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
Este comando é transpose
para transpose ( -t
) e o separador de campos a ser usado é um espaço ( --fsep " "
).
Seu exemplo
Como os dados da amostra estão em um formato um pouco mais complexo, eles precisam ser tratados em duas fases. Primeiro, precisamos traduzi-lo para um formato que transpose
possa lidar.
A execução deste comando colocará os dados em um formato mais horizontalmente amigável:
$ 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
Agora só precisamos remover as ocorrências secundárias do título1, título2, etc .:
$ 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
Agora está em um formato que transpose
pode lidar. O comando a seguir fará toda a transposição:
$ 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