次のように、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行に入力するか、または
S
を追加して「開始」と「終了」を表示しますE
。次に、値を数値でソートします。あなたは次のようなものを得るでしょう
3631S
3651
3667
...
3900
3913E
3996S
4006
...
S
aと終了値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
。
答え2
awkを使用できます。
awk '{if( ($1 > $2) && ($1 < $3) ){print NR" "$1" "$2" "$3}}' final_exons.txt
ただし、col1 と (col2 と col3) を別々に処理する場合は、別々のファイルに分割することをお勧めします。または、データベースにデータを保存し、その中で間隔テストを実行します。しかし、最も効率的な方法は、おそらくデータを通常の配列にロードし、他のスクリプト言語(php、python、perl ...)でテストループを実装することです。