2013-05-02 15 views
6

Piszę plik skryptu powłoki, w którym muszę wydrukować pewne kolumny pliku. Więc staram się używać awk. Numery kolumn są obliczane w skrypcie. Nprop jest zmienna w pętli for, który zmienia się od 1 do 8.Przekazywanie zmiennych do awk z bash

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

Próbowałem również następujące:

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

Powoduje drukowanie Pierwsze trzy kolumny cały czas.

Odpowiedz

4
avg=1+3*$nprop 

Spowoduje to ustawienie $avg do 1+3*4, dosłownie, jeśli $prop jest 4 na przykład. Powinieneś oceny tego wyrażenia:

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

i korzystać z wersji skryptu awk z nawiasu.

+2

Nie rób tego, po prostu prześlij nprop do awk i obliczyć średnią w sekcji BEGIN. –

1

Użyj BEGIN{ } blok, aby utworzyć kilka zmiennych awk:

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

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

Ten pojedynczy awk skrypt jest tłumaczeniem, co chcesz:

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

Nie trzeba analizować swoje plik 8 razy w pętli powłoki po prostu parsuj go raz z awk.

+1

To może być naprawdę lepsze. (O ile w każdej iteracji nie zmieni się '$ nazwa_pliku5', to tak się nie dzieje _). – Mat

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

Jeśli chcesz po prostu swoją wartość początkową (nprop), aby zwiększyć na każdym przejściu pliku i przetworzyć plik 8 razy, pozbyć się pętli zewnętrznej i po prostu to zrobić:

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

W GNU awk możesz zamienić NR/FNR na ARGIND.

Powiązane problemy