为什么这个awk脚本看不到shellvariables?

请告诉我为什么这个程序不工作? 帮助我改进它。

for i in $(seq 2 30); do awk '{if ($i < 0.05) print $1,$i}' test.txt > phen_$i.txt; done 

文件test.txt如下所示:

 name phen1 phen2 rs549 0.02 0.02 rs699 0.03 0.03 rs701 1 1 rs751 0.449 0.449 rs884 1 1 rs923 0.9775 0.02 rs970 0.9836 0.03 rs1085 0.0001 0.99 rs1220 0.9316 0.9316 

输出文件预期为两个不同的文件,分别是根据if条件,分别包含col1和col2,以及col1和col3的phen_2.txt和phen_3.txt。

预期的结果为phen_2.txt:

 rs549 0.02 rs699 0.03 rs1085 0.0001 

预期的结果为phen_3.txt:

 rs549 0.02 rs699 0.03 rs923 0.02 rs970 0.03 

请帮忙!

 for ((i = 2; i <= 30; i++)); do awk -vi="$i" '$i < 0.05 {print $1, $i}' test.txt > "phen_$i.txt"; done 

使用变量传递( -v )来获取shell变量到AWK脚本中。

你不需要seq

编辑:

修正了一些过分热心和糟糕的错误。

以下是如何在AWK中完成同样的事情:

 awk '{for (i = 2; i <= 30; i++) {if ($i < 0.05) {print $1, $i > "phen_" i ".txt"}}}' test.txt 

这只会经过输入文件一次,但它循环输入每行的输出文件的集合。 shell版本反复读取输入文件,但是会向每个输出文件写入一次。

使用$'$i'而不是$

 for i in $(seq 2 30) do awk '{if ($'$i' < 0.05) print $1,$'$i'}' test.txt > phen_$i.txt done 

问题是你的$i从bash不能进入' '字符串。 所以你需要在$i之前关闭这个字符串,然后再次打开它。