2013-05-02 26 views
6

私はファイルの特定の列を印刷する必要があるシェルスクリプトファイルを作成しています。だから私はawkを使ってみる。列番号はスクリプトで計算されます。これは、最初の3つの列のすべての時間を印刷することになるbashからawkに変数を渡す

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

:Npropは、私は、以下を試みている1から8

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

に変化するforループで変数です。

答えて

4
avg=1+3*$nprop 
$prop

は例えば4である場合、これは、文字通り、1+3*4から$avgを設定します。

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

を括弧でawkスクリプトのバージョンを使用する:あなたは、その式を評価する必要があります。

+2

これをしないでください。単にnpropをawkに渡し、BEGINセクションの平均を計算してください。 –

1

は、awkの変数のカップルを作成するためにBEGIN{ }ブロックを使用します。

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

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

この単一awkスクリプトは何をしたいの翻訳です:

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

あなたのを解析する必要はありません。シェルループ内で8回ファイルを実行すると、それはただちにawkと解析されます。

+1

それは確かに私が良いと思うかもしれない。 ( '$ filename5'が各繰り返しで変更されない限り、それは_appear_には当てはまりません)。 – Mat

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

あなただけのファイルのすべてのパスでインクリメントし、ファイルを処理する8回、外部ループを取り除くと、ちょうどこれを行うには、あなたのシード値(npropを)したい場合:

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

GNU awkでは、NR/FNRをARGINDに置き換えることができます。