Linux
計算由兩列定義的兩個值之間的值
我有一個數據儲存在三列中,如下所示:
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
提前感謝您的任何提示和提示
S
將每個值放在一行中,但通過附加或標記“開始”和“結束”E
。現在對數值進行排序。你會得到類似的東西3631S 3651 3667 ... 3900 3913E 3996S 4006 ...
- 計算 a
S
和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}'
第一個
awk
並sort
執行步驟 1。有一個$3!=""
測試(也可能是$2!=""
),因為第一列中的行比第二列或第三列中的行多。第二個
awk
對應於步驟 2。如果讀取帶有 的行S
,它將重置計數器,如果該行沒有標記,則將其遞增,如果讀取帶有 的行,則將其列印(連同行號)E
。在您提供的範例文件上執行時的輸出是
0: 12; 1: 5; 2: 4; 3: 2; ...; 22: 0
.