计算模式范围内的平均值



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

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

有了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

这将省略覆盖范围文件中没有任何数据的任何模式;您可以将END中的循环更改为循环模式文件中的所有内容,并只为未显示的内容输出0。

最新更新