请告诉我为什么这个程序不起作用?帮助我提高它。
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
输出文件应该是两个不同的文件,即包含col1和col2的phen_2.txt和phen_3.txt,以及根据if条件分别为col1和col3。
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
请帮忙!
答案 0 :(得分:2)
for ((i = 2; i <= 30; i++)); do awk -v i="$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版本重复读取输入文件,但只写入一次输出文件。
答案 1 :(得分:1)
使用$'$i'
代替$
:
for i in $(seq 2 30)
do
awk '{if ($'$i' < 0.05) print $1,$'$i'}' test.txt > phen_$i.txt
done
问题是来自bash的$i
无法进入' '
- 字符串。因此,您需要在$i
之前关闭字符串,然后再将其打开。