Shell 计算模式范围内的平均值
我对这类工作非常陌生,所以请容忍我:)我试图计算各种模式的平均值。例如,我有两个以制表符分隔的文件: coverage.txt文件包含两个列。第一列表示位置,第二列表示分配给该位置的值。大约有4*10^6个位置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
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