1

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

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

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

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

请帮忙!

4

2 回答 2

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 版本重复读取输入文件,但写入每个输出文件一次。

于 2012-07-10T11:13:52.777 回答
1

使用$'$i'代替$

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

问题是您$i的 bash 无法进入' '-string。所以你需要先关闭字符串,然后$i再打开它。

于 2012-07-10T11:12:08.907 回答