2つの列で定義された2つの値の間の値を計算します。

2つの列で定義された2つの値の間の値を計算します。

次のように、3つの列にデータが格納されています。

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

最初の列は特定の値で、2番目の列は開始、3番目の列は終了です。最初の列には825849行があり、2番目と3番目の列には58386行があります。値が開始と終了の間にある場合は、最初の値から計算を開始する必要があります。

私のファイルでは、列1の最初の12個の特定の値が最初の始まりと終わりの間にあり、次の5つの特定の値が2番目の始まりと終わりの間にあることがわかります。ファイル全体を確認する必要があります。私はこれを試しましたが、うまくいきますが、非常に遅いです。

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. 各値を1行に入力するか、またはSを追加して「開始」と「終了」を表示しますE。次に、値を数値でソートします。あなたは次のようなものを得るでしょう
3631S
3651
3667
...
3900
3913E
3996S
4006
...
  1. Saと終了値Eの間の発生回数を計算します。

ただスクリプトを書いて幸せです!

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}'

まず、手順1をawk実行してくださいsort。 2番目または3番目の列よりも最初の列に多くの行があるため、テストがあります$3!=""(そしてそれも可能です)。$2!=""

2番目はawkステップ2に対応します。ストライプの行を読み取るとカウンタがリセットされ、行のS表示がオフになるとカウンタがインクリメントされます。縞模様の行を読むと、行番号で印刷されますE

提供されたサンプルファイルで実行したときの出力はです0: 12; 1: 5; 2: 4; 3: 2; ...; 22: 0

おすすめ記事