2013-05-02 26 views
6

Ich schreibe eine Shell-Skript-Datei, in der ich bestimmte Spalten einer Datei drucken muss. Also versuche ich awk zu benutzen. Die Spaltennummern werden im Skript berechnet. Nprop ist eine Variable in einer for-Schleife, die von 1 bis 8.Variablen in awk aus Bash übergeben

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

habe ich versucht, ändert sich auch die folgende:

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

Dies resultiert in den Druck der ersten drei Spalten die ganze Zeit.

Antwort

4
avg=1+3*$nprop 

Dies wird $avg-1+3*4 wahrsten Sinne des Wortes gesetzt, wenn $prop 4 zum Beispiel ist. Sie sollten diesen Ausdruck evaluieren:

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

Und verwenden Sie die Version des awk Skript mit Klammern.

+2

Tun Sie das nicht, übergeben Sie einfach nprop an awk und berechnen Sie den Durchschnitt in der BEGIN-Sektion. –

1

Verwenden Sie einen BEGIN{ } Block ein paar awk Variablen zu erstellen:

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

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

Dieses einzelne awk Skript ist eine Übersetzung von dem, was Sie wollen:

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

Sie brauchen nicht Ihre zu analysieren Datei 8 Mal in einer Shell-Schleife parsen Sie es nur einmal mit awk.

+1

Das könnte in der Tat besser sein, denke ich. (Es sei denn, "$ filename5" ändert sich bei jeder Iteration, aber das erscheint nicht _). – Mat

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

Wenn Sie nur Ihren Startwert (nprop) wollen bei jedem Durchlauf der Datei zu erhöhen und der Datei 8 mal verarbeiten, erhält von externer Schleife befreien und gerade dies zu tun:

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

In GNU awk können Sie NR/FNR durch ARGIND ersetzen.