impression variable à l'intérieur de l'awk
Question
Dans ce script, je veux qu'awk imprime les variables $ fichier
, $ f
, $ order
et sum / NR
(tous sur une seule ligne)
#!/bin/bash
for file in pmb_mpi tau xhpl mpi_tile_io fftw ; do
for f in 2.54 1.60 800 ;do
if [ ${f} = 2.54 ]
then
for order in even odd ; do
# echo ${file}_${f}_${order}_v1.xls >> P-state-summary.xls
awk '{sum+=$2} END {print ${file}_${f}_${order}_v1.xls, sum/NR}' ${file}_${f}_${order}_v1.xls >> P-state-summary.xls
done
else
# echo ${file}_${f}_v1.xls >> P-state-summary.xls
awk '{sum+=$2} END {print ${file}_${f}_v1.xls , sum/NR}' ${file}_${f}_v1.xls >> P-state-summary.xls
fi
done
done
Quelqu'un parmi vous a-t-il eu l'amabilité de m'aider?
La solution
Vous pouvez faire ceci:
echo -n "${file}_${f}_${order}_v1.xls " >> P-state-summary.xls
# or printf "${file}_${f}_${order}_v1.xls " >> P-state-summary.xls
awk '{sum+=$2} END {print sum/NR}' "${file}_${f}_${order}_v1.xls" |
tee "${file}_${f}_avrg.xls" >> P-state-summary.xls
Utilisation de echo -n
ou de printf
sans un " \ n " affichera le texte sans nouvelle ligne afin que la sortie de la commande awk
le suive sur la même ligne. J'ai ajouté un espace en tant que séparateur, mais vous pouvez utiliser n'importe quoi.
L'utilisation de tee
vous permettra d'écrire votre sortie dans les fichiers individuels et dans le fichier de résumé à l'aide d'un seul appel awk
par fichier d'entrée (ordre).
Autres conseils
awk
ne récupère pas les variables shell, vous devez les transmettre en tant que variables awk
:
pax> export x=XX
pax> export y=YY
pax> awk 'BEGIN{print x "_" y}'
_
pax> awk -vx=$x -v y=$y 'BEGIN{print x "_" y}'
XX_YY
Il existe un autre moyen de le faire en utilisant des guillemets doubles au lieu de guillemets simples (pour que bash
substitue les valeurs avant que awk
ne les voie), mais vous devez ensuite commencez à échapper aux symboles $
et à toutes sortes d'autres choses dans votre commande awk
:
pax> awk "BEGIN {print \"${x}_${y}\"}"
XX_YY
Je préfère utiliser la création de variables explicites.
En passant, il existe une autre solution à votre précédente question connexe ici qui devrait fonctionner.