탭으로 구분된 두 개의 정렬된 파일이 있습니다.
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