计算由两列定义的两个值之间的值

计算由两列定义的两个值之间的值

我有一个数据存储在三列中,如下所示:

3651 3631 3913
3667 3996 4276
3674 4486 4605
3707 4706 5095
3720 5174 5326
3750 5439 5899
3755 5928 6263
3767 6437 7069
3779 7157 7232
3882 7384 7450
3886 7564 7649
3900 7762 7835
4006 7942 7987
4015 8236 8325
4026 8417 8464
4065 8571 8737
4156 6790 7069
4493 7157 7450
4541 7564 7649
4551 7762 7835
4597 7942 7987
4756 8236 8325
4776 8417 8464

其中第一列是特定值,第二列是开始,第三列是结束。第一列有 825849 行,第二列和第三列有 58386 行。如果值位于开始和结束之间,我需要从第一个开始计数。

我知道在我的文件中,第 1 列中的前 12 个特定值位于第一个开始和结束之间,接下来的 5 个特定值位于第二个开始和结束之间,依此类推。我需要检查整个文件。我已经尝试过这个,它可以工作,但速度非常慢:

coords='final_exons.txt'

snp=( $( cat $coords | awk '{print $1}') )
exon_start=( $( cat $coords | awk '{print $2}') )
exon_end=( $( cat $coords | awk '{print $3}') )

i=0
counter=0
for value in ${exon_end[@]}; do
    new_val=$counter
    counter=0
    let "i++"
    for snps in ${snp[@]}; do

        if [[ $value > $snps ]]; then
            #statements
            let "counter++"
            #$counter=$(echo "scale=2; $counter-$new_val" | bc)
        else
            #$new_val=$(echo "scale=2; $counter-$")
            break
        fi
    done
    #echo "NOWENOWE $new_val "
    #echo "COUNTER $value : $counter "
    final=$(echo "scale=2; sqrt(($counter-$new_val)^2)" | bc)
    echo "Exon $i : $final SNPs"
done

预先感谢您提供任何提示和技巧

完整数据链接

答案1

  1. 将每个值放在一行中,但通过附加S或标记“开始”和“结束” E。现在按数字对值进行排序。你会得到类似的东西
3631S
3651
3667
...
3900
3913E
3996S
4006
...
  1. 计算 aSE终止值之间出现的次数。

写好剧本,开心就好!

awk '
    {print $1} 
    $3!="" {print $2"S"; print $3"E"} 
' final_exons.txt | sort -n | awk '
    !/E|S/ {count++; next}
    /S/ {count=0; next}
    /E/ {print line++": "count}'

第一个awk执行sort步骤 1。有一个$3!=""测试(也可能是$2!=""),因为第一列中的行数比第二列或第三列中的行数多。

第二个awk对应于步骤 2。如果读取带 的行,则重置计数器;S如果该行没有标记,则增加计数器;如果读取带 的行,则打印它(连同行号)E

在您提供的示例文件上运行时的输出是0: 12; 1: 5; 2: 4; 3: 2; ...; 22: 0.

答案2

我可以使用 awk:

awk '{if( ($1 > $2) && ($1 < $3) ){print NR" "$1" "$2" "$3}}' final_exons.txt

但是如果 col1 和( col2 和 col3 )是分开处理的,你最好将它们分成单独的文件。或者把数据存入数据库,然后在里面做区间测试。但最有效的方法可能是将数据加载到常规数组中,并用其他脚本语言(php、python、perl ...)实现测试循环

相关内容