Shell 计算模式范围内的平均值

Shell 计算模式范围内的平均值,shell,awk,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 现在,我想计算

我对这类工作非常陌生,所以请容忍我:)我试图计算各种模式的平均值。例如,我有两个以制表符分隔的文件:

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
awk'{
if(文件名~“patterns.txt”){
最低[$1]=$2
最高[$1]=$3
}否则{
对于(帕特,以分钟为单位){
如果($1>=min[pat]&&&1