从Bash传递变量到awk

8

我正在编写一个shell脚本文件,需要打印文件的某些列。因此,我尝试使用awk。列号在脚本中计算。Nprop是for循环中的变量,从1到8变化。

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个回答

4
avg=1+3*$nprop

这将设置$avg的值为1+3*4,也就是字面意思,例如$prop为4。你应该对该表达式进行评估。
avg=$(( 1+3*$nprop ))

请使用带有括号的 awk 脚本版本。


2
不要那样做,只需将nprop传递给awk,并在BEGIN部分计算平均值。 - Ed Morton

2
这个单一的awk脚本是你想要的翻译:
awk '{j=0;for(i=4;i<=25;i=3*++j+1)printf "%s %s %s ",$i,$(i+1),$(i+2);print ""}' 

您不需要在shell循环中解析文件8次,只需使用awk一次解析即可。


1
这个确实可以更好,我认为。(除非 $filename5 在每次迭代中都会改变,但这似乎不是这种情况。) - Mat

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

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。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接