タブで区切られた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