Al di fuori del rotolamento di una soluzione personalizzata per trasporre righe con colonne da una riga di comando, l'unico strumento che abbia mai visto che può fare questo è uno strumento chiamato ironicamente transpose
.
Installazione
Sfortunatamente non è presente in alcun repository, quindi dovrai scaricarlo e compilarlo. Questo è piuttosto semplice poiché non ha librerie aggiuntive da cui dipende. Può essere realizzato in questo modo:
$ gcc transpose.c -o transpose
uso
Può gestire file di testo semplici con facilità. Per esempio:
$ cat simple.txt
X column1 column2 column3
row1 0 1 2
row2 3 4 5
row3 6 7 8
row4 9 10 11
Può essere trasposto usando questo 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
Questo comando serve transpose
a trasporre ( -t
) e il separatore di campo da usare è uno spazio ( --fsep " "
).
Il tuo esempio
Poiché i dati di esempio sono in un formato leggermente più complesso, devono essere trattati in 2 fasi. Per prima cosa dobbiamo tradurlo in un formato che transpose
possa essere gestito.
Eseguendo questo comando, i dati verranno inseriti in un formato più orizzontale:
$ 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
Ora non ci resta che rimuovere le occorrenze secondarie di title1, title2, ecc .:
$ 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
Ora è in un formato che transpose
può gestire. Il seguente comando eseguirà l'intera trasposizione:
$ 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