7

我正在编写一个 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 回答 4

4
avg=1+3*$nprop

这将设置$avg1+3*4,从字面上看,$prop例如 if 是 4 。您应该评估该表达式:

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

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

于 2013-05-02T14:38:07.193 回答
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.

于 2013-05-02T15:15:28.957 回答
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
于 2013-05-02T15:05:31.943 回答
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 中,您可以将 NR/FNR 替换为 ARGIND。

于 2013-05-02T16:34:14.423 回答