variabile di stampa all'interno di awk
Domanda
In questo script, voglio che awk stampi le variabili $ file
, $ f
, $ order
e sum / NR
(tutto in una sola riga)
#!/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
Colud qualcuno di voi gentilmente mi aiuti in questo?
Soluzione
Puoi farlo:
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
Uso di echo -n
o printf
senza " \ n " produrrà il testo senza una nuova riga, quindi l'output del comando awk
lo seguirà sulla stessa riga. Ho aggiunto uno spazio come separatore, ma potresti usare qualsiasi cosa.
L'utilizzo di tee
ti consentirà di scrivere l'output nei singoli file e nel file di riepilogo utilizzando solo un awk
invocazione per file di input (ordine).
Altri suggerimenti
awk
non esce e ottieni variabili shell per te, devi passarle come variabili 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
C'è un altro modo di farlo usando le virgolette doppie anziché le virgolette singole (in modo che bash
sostituisca i valori prima che awk
li veda), ma poi devi inizia a scappare dai simboli $
e da ogni altra cosa nel tuo comando awk
:
pax> awk "BEGIN {print \"${x}_${y}\"}"
XX_YY
Preferisco usare la creazione di variabili esplicite.
A proposito, c'è un'altra soluzione alla tua precedente domanda correlata qui che dovrebbe funzionare.