値が特定の範囲に属する場合、値の合計が印刷されます。

値が特定の範囲に属する場合、値の合計が印刷されます。

タブで区切られた2つのソートされたファイルがあります。

input.txt
10      282035  282125  RNA1     -
10      4134522 4134564 RNA1     -
10      5299783 5299910 RNA2     -
10      5900317 5900359 RNA1     -

ref.txt
  1 9       137792944
  1 9       137792945
  1 10      282074
  4 10      282095
  4 10      5900329

特定の条件が満たされたら、値の合計を出力したいと思います。

今すぐ:

IF参照 $2==$1 入力

そして

ref$3 は min==input$2 && max==input$3 の範囲に属します。

input$0 と ref$1 の合計を印刷します (input$6 で)。それ以外の場合は0を印刷します(input $ 6)。したがって、結果は次のようになります。

10      282035  282125  RNA1     -  5
10      4134522 4134564 RNA1     -  0
10      5299783 5299910 RNA2     -  0
10      5900317 5900359 RNA1     -  4

これが私が思いついたものです:


awk '
NR == FNR {min[NR]=$2; max[NR]=$3; chr[NR]=$1; next}
 {                
     for (id in min) 
         if (($2==chr[NR])&&(min[id] < $3 && $3 < max[id])) {
             print $0, sum+=$1
             break              
         }
}                                     
' input.txt ref.txt > output.txt

何の出力も得られないので、ここには明らかに何か問題があります。また、「そうでなければゼロを印刷する」がまだありません。

誰でも私を助けることができますか?

答え1

これはネストされた配列を可能にするGNU awkを使用します。

gawk '
  NR == FNR {
    ref[$2][$3] = $1
    next
  }
  $1 in ref {
    sum = 0
    for (key in ref[$1])
      if ($2 <= key && key <= $3)
        sum += ref[$1][key]
    print $0, sum
  }
' ref.txt input.txt

答え2

awk 'NR==FNR {dat[NR]=$0;next} { for ( i in dat ) { split(dat[i],arr," ");tag=arr[1];min=arr[2];max=arr[3];if ($2==tag && $3 <= max && $3 >= min) { res[i]+=$1 } } } END { for (i in dat) { print dat[i]" "(res[i]!=0?res[i]:"0") } }' input ref


awk 'NR==FNR {
 dat[NR]=$0;next
} 
{ for ( i in dat ) { 
   split(dat[i],arr," ")
   tag=arr[1];
   min=arr[2];
   max=arr[3];
   if ($2==tag && $3 <= max && $3 >= min) { 
     res[i]+=$1 
     } 
   } 
} 
END { 
  for (i in dat) { 
     print dat[i]" "(res[i]!=0?res[i]:"0") 
  } 
}' input ref

input.txt の各行を配列に入れます。次に、ref.txtの各行を取得し、awk関数分割を使用して追加のデータを配列arrに入れます。この配列から変数ラベル、最小値、最大値を取得します。その後、配列datの各行は条件に従ってチェックされ、配列resはそれに応じて増加します。最後に、datループはデータと数をresとして印刷します。

結果:

10      5900317 5900359 RNA1     - 4
10      282035  282125  RNA1     - 5
10      4134522 4134564 RNA1     - 0
10      5299783 5299910 RNA2     - 0

関連情報