我对这种工作很新,所以请耐心等待:)我正在尝试计算模式范围的均值。例如。我有两个以制表符分隔的文件:
文件coverage.txt包含两个列。第一列表示位置,第二列表示分配给该位置的值。有大约4 * 10 ^ 6个职位。
coverage.txt
1 10
2 30
3 5
4 10
第二个文件“patterns.txt”包含三列1.模式的名称,2。模式的起始位置和3.模式的结束位置。图案范围不重叠。有大约3000种模式。
patterns.txt
rpoB 1 2
gyrA 3 4
现在我想计算分配给不同模式位置的值的平均值,并将输出写入包含patterns.txt第一列作为标识符的新文件。
output.txt
rpoB 20
gyrA 7.5
我认为这可以使用awk
来完成,但我不知道从哪里开始。非常感谢您的帮助!
答案 0 :(得分:3)
有400万个职位,可能是时候找到一个比shell / awk更实质的编程语言了,但你可以用一个这样的东西一次性完成:
awk '{
if (FILENAME ~ "patterns.txt") {
min[$1]=$2
max[$1]=$3
} else {
for (pat in min) {
if ($1 >= min[pat] && $1 <= max[pat]) {
total[pat] += $2
count[pat] += 1
}
}
}
}
END {
for (pat in total) {
print pat,total[pat]/count[pat]
}
}' patterns.txt coverage.txt
这省略了在coverage文件中没有任何数据的任何模式;你可以改变END
中的循环来循环遍历模式文件中的所有内容,而只输出那些没有显示的内容。