값이 특정 범위에 속하면 값의 합을 인쇄합니다.

값이 특정 범위에 속하면 값의 합을 인쇄합니다.

탭으로 구분된 두 개의 정렬된 파일이 있습니다.

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

아무런 출력도 얻지 못하기 때문에 여기에는 분명히 뭔가 문제가 있습니다. 또한 "그렇지 않으면 0을 인쇄합니다"가 여전히 누락되었습니다.

누구든지 나를 도와줄 수 있나요?

답변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

관련 정보