2013-05-02 20 views
6

Sto scrivendo un file di script di shell in cui devo stampare determinate colonne di un file. Quindi cerco di usare awk. I numeri delle colonne sono calcolati nello script. Nprop è una variabile in un ciclo, che cambia da 1 a 8.Passaggio di variabili in awk da bash

avg=1+3*$nprop 
awk -v a=$avg '{print $a " " $a+1 " " $a+2}' $filename5 >> neig5.dat 

Ho provato seguito anche:

awk -v a=$avg '{print $a " " $(a+1) " " $(a+2) }' $filename5 >> neig5.dat 

Ciò comporta la stampa delle prime tre colonne per tutto il tempo.

risposta

4
avg=1+3*$nprop 

Questo imposterà $avg a 1+3*4, letteralmente, se $prop è 4 per esempio. Si dovrebbe essere valutando che l'espressione:

avg=$((1+3*$nprop)) 

e utilizzare la versione dello script awk con parentesi.

+2

Non farlo, basta passare nprop a awk e calcolare la media nella sezione BEGIN. –

1

utilizzare un blocco BEGIN{ } per creare un paio di variabili awk:

avg=$((1+3*$nprop)) 

awk -v a=$avg 'BEGIN{ap1=a+1;ap2=a+2} {print $a " " $ap1 " " $ap2}' $filename5 >> neig5.dat 
2

Questo singolo script awk è una traduzione di ciò che si vuole:

awk '{j=0;for(i=4;i<=25;i=3*++j+1)printf "%s %s %s ",$i,$(i+1),$(i+2);print ""}' 

Non è necessario analizzare la vostra file 8 volte in un ciclo di shell, analizzalo una sola volta con awk.

+1

Penso che potrebbe essere meglio. (A meno che '$ nomefile5' non cambi ad ogni iterazione, ma non _appear_ per essere il caso.) – Mat

1
awk -v n="$nprop" 'BEGIN{x=3*n} {a=x; print $++a, $++a, $++a}' file 

Se si desidera solo il valore del seme (nprop) per incrementare ad ogni passaggio del file ed elaborare il file 8 volte, sbarazzarsi del circuito esterno e solo fare questo:

awk 'BEGIN{for (i=2;i<=8;i++) ARGV[++ARGC] = ARGV[1]} {a=3*NR/FNR; print $++a, $++a, $++a}' file 

In GNU awk puoi sostituire NR/FNR con ARGIND.

Problemi correlati