请告诉我为什么这个程序不工作? 帮助我改进它。
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
之前关闭这个字符串,然后再次打开它。