计算模式范围的平均值

时间:2015-10-30 15:17:41

标签: shell awk

我对这种工作很新,所以请耐心等待:)我正在尝试计算模式范围的均值。例如。我有两个以制表符分隔的文件:

文件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来完成,但我不知道从哪里开始。非常感谢您的帮助!

1 个答案:

答案 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中的循环来循环遍历模式文件中的所有内容,而只输出那些没有显示的内容。