Linux

計算由兩列定義的兩個值之間的值

  • March 16, 2020

我有一個數據儲存在三列中,如下所示:

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

其中第一列是特定值,第二列是開始,第三列是結束。第 1 列有 825849 行,第 2 和第 3 列有 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. 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}'

第一個awksort執行步驟 1。有一個$3!=""測試(也可能是$2!=""),因為第一列中的行比第二列或第三列中的行多。

第二個awk對應於步驟 2。如果讀取帶有 的行S,它將重置計數器,如果該行沒有標記,則將其遞增,如果讀取帶有 的行,則將其列印(連同行號)E

在您提供的範例文件上執行時的輸出是0: 12; 1: 5; 2: 4; 3: 2; ...; 22: 0.

引用自:https://unix.stackexchange.com/questions/573094