En dehors de rouler une solution personnalisée pour transposer des lignes avec des colonnes à partir d'une ligne de commande, le seul outil que j'ai jamais vu qui puisse le faire est un outil appelé ironiquement transpose
.
Installation
Malheureusement, il ne se trouve dans aucun dépôt, vous devrez donc le télécharger et le compiler. C'est assez simple car il n'a pas de bibliothèques supplémentaires dont il dépend. Cela peut être accompli comme suit:
$ gcc transpose.c -o transpose
Usage
Il peut facilement gérer des fichiers texte simples. Par exemple:
$ cat simple.txt
X column1 column2 column3
row1 0 1 2
row2 3 4 5
row3 6 7 8
row4 9 10 11
Peut être transposé à l'aide de cette commande:
$ 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
Cette commande consiste transpose
à transposer ( -t
) et le séparateur de champ à utiliser est un espace ( --fsep " "
).
Votre exemple
Étant donné que vos exemples de données sont dans un format légèrement plus complexe, ils doivent être traités en 2 phases. Nous devons d'abord le traduire dans un format transpose
compatible.
L'exécution de cette commande mettra les données dans un format plus convivial horizontalement:
$ 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
Il nous suffit maintenant de supprimer les occurrences secondaires du titre1, du titre2, 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
C'est maintenant dans un format qui transpose
peut gérer. La commande suivante fera toute la transposition:
$ 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