Si vous savez que vous avez 4 variables a
, x
, y
, c
et que le fichier est formaté comme un fichier séparé par des tabulations et que vous voulez le format exact de la sortie montrée, vous pouvez simplement utiliser un " Force brute "où vous vérifiez le contenu des champs 4
y 6
pour le nom de la variable et affiche la valeur du champ 5
ou 7
formaté comme indiqué en utilisant printf
.
Par exemple, en connaissant les noms des variables, vous pouvez simplement éditer la ligne d'en-tête avant de traiter chaque enregistrement comme suit :
awk -F"\t" '
FNR==1 {
print "\t\t\t a x y c"
}
{
printf "%-8s%8s%8s ", $1, $2, $3
if ($4=="a")
printf "%-5s", $5
else if ($6=="a")
printf "%-5s", $7
else
printf "%-5s", " "
if ($4=="x")
printf "%-5s", $5
else if ($6=="x")
printf "%-5s", $7
else
printf "%-5s", " "
if ($4=="y")
printf "%-5s", $5
else if ($6=="y")
printf "%-5s", $7
else
printf "%-5s", " "
if ($4=="c")
printf "%-5s\n", $5
else if ($6=="c")
printf "%-5s\n", $7
else
print ""
}
' tabfile
Exemple d'utilisation/de sortie
Avec votre contribution en tabfile
vous l'auriez fait :
$ awk -F"\t" '
> FNR==1 {
> print "\t\t\t a x y c"
> }
> {
> printf "%-8s%8s%8s ", $1, $2, $3
>
> if ($4=="a")
> printf "%-5s", $5
> else if ($6=="a")
> printf "%-5s", $7
> else
> printf "%-5s", " "
>
> if ($4=="x")
> printf "%-5s", $5
> else if ($6=="x")
> printf "%-5s", $7
> else
> printf "%-5s", " "
>
> if ($4=="y")
> printf "%-5s", $5
> else if ($6=="y")
> printf "%-5s", $7
> else
> printf "%-5s", " "
>
> if ($4=="c")
> printf "%-5s\n", $5
> else if ($6=="c")
> printf "%-5s\n", $7
> else
> print ""
> }
> ' tabfile
a x y c
13435 830169 830264 95 16
09433 835620 835672 46
30945 838405 838620 21 19
94853 850475 850660 15
04958 865700 865978 98 16
Ce qui permet d'obtenir le résultat souhaité. Cette approche en une seule passe sera également très efficace pour 450 000 lignes d'entrée. Comme c'est un peu long pour un script en ligne de commande, vous pouvez simplement le mettre dans un awk script et l'appeler avec le nom du fichier. N'hésitez pas à me contacter si vous avez des questions.
En tant que fichier script.
En utilisant un fichier script, il suffit de placer le contenu dans un fichier et de le rendre exécutable, par ex.
#!/usr/bin/awk -f
BEGIN { FS="\t" }
FNR==1 {
print "\t\t\t a x y c"
}
{
printf "%-8s%8s%8s ", $1, $2, $3
if ($4=="a")
printf "%-5s", $5
else if ($6=="a")
printf "%-5s", $7
else
printf "%-5s", " "
if ($4=="x")
printf "%-5s", $5
else if ($6=="x")
printf "%-5s", $7
else
printf "%-5s", " "
if ($4=="y")
printf "%-5s", $5
else if ($6=="y")
printf "%-5s", $7
else
printf "%-5s", " "
if ($4=="c")
printf "%-5s\n", $5
else if ($6=="c")
printf "%-5s\n", $7
else
print ""
}
Enregistré en tant que awkscript
vous le feriez chmod +x awkscript
et de l'exécuter :
$ ./awkscript tabfile
a x y c
13435 830169 830264 95 16
09433 835620 835672 46
30945 838405 838620 21 19
94853 850475 850660 15
04958 865700 865978 98 16