2013-05-02 129 views
6

我正在编写一个shell脚本文件,其中我必须打印文件的某些列。所以我尝试使用awk。列号在脚本中计算。 Nprop是for循环中的变量,改变从1到8将变量从bash传递到awk

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

我试图下文中也:

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

这导致打印前三列的所有时间。

回答

4
avg=1+3*$nprop 

这将设置$avg1+3*4,从字面上看,如果$prop是4实例。你应该对表达式:

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

,并使用awk脚本的版本括号。

+2

不要这样做,只需将nprop传递给awk并计算BEGIN节中的平均值即可。 – 2013-05-02 16:26:51

1

使用BEGIN{ }块创建几个AWK变量:

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次在shell循环中只用awk解析一次。

+1

我认为这的确可以做得更好。 (除非在每次迭代中'$ filename5'都会改变,但这并不会出现这种情况。) – Mat 2013-05-02 15:49:39

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

如果你只是想你的种子值(nprop),以增加对文件的每一通和处理文件的8倍,摆脱你的外部循环的,只是这样做:

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

在GNU awk中,您可以用ARGIND替换NR/FNR。