salut,
je me base sur un fichier res.txt supposé comme suit :
1 2 3 4 5 6 7 8 9
| Pos X [at 155.631] -64.5426
Pos Y [at 155.631] 866.022
** HO **
Pos X [at 158.002] -30.66
Pos Y [at 158.002] 15.493
** HO **
Pos X [at 192.53] 6.802
Pos Y [at 192.53] 480.6735
** HO ** |
le oneliner awk suivant fait le job :
awk -F'[ \\[\\]\t]+' 'BEGIN {printf("%-20s%-20s%s\n", "# Time", "Pos X", "Pos Y")} /^Pos [XY]/ {t=$4; tab[$2] = $5; next} /^\*\* HO/ {printf("%-20s%-20s%s\n", t, tab["X"], tab["Y"])}' res.txt
qu'on peut "déplier" de la façon suivante pour un peu plus de lisibilité :
1 2 3 4 5 6 7 8 9 10 11 12 13
| BEGIN {
printf ("%-20s%-20s%s\n", "# Time", "Pos X", "Pos Y") # 1ère ligne de l'affichage
}
/^Pos [XY]/ { # pour chaque ligne qui commence par "Pos X" ou "Pos Y"
t=$4 # t = Time
tab[$2] = $5 # tab["X" ou "Y"] = valeurX ou valeurY
next # fin du traitement pour cette ligne, on passe à la ligne suivante
}
/^\*\* HO/ { # si on rencontre une ligne qui commence par "** HO", c'est qu'il est temps d'afficher
printf("%-20s%-20s%s\n", t, tab["X"], tab["Y"])
} |
l'option -F'[ \\[\\]\t]+' permet de spécifier les séparateurs de champs, en l'occurrence "un ou plusieurs espace, tabulation (\t), ou crochet ([ ou ] qu'on est obligé d'échapper 2 fois \\[\\])"
et le résultat :
1 2 3 4
| # Time Pos X Pos Y
155.631 -64.5426 866.022
158.002 -30.66 15.493
192.53 6.802 480.6735 |
Partager