我正在编写一个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
这导致始终打印前三列。
答案 0 :(得分:4)
avg=1+3*$nprop
如果$avg
为4,则会将1+3*4
设置为$prop
。您应该评估该表达式:
avg=$(( 1+3*$nprop ))
并使用带括号的awk
脚本版本。
答案 1 :(得分: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
解析一次。
答案 2 :(得分: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
答案 3 :(得分: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。