AWK 변수(따옴표로 묶인 1) + 조건

AWK 변수(따옴표로 묶인 1) + 조건

온라인에서 많은 게시물을 읽었 awk -v a=$var1 ..'BEGIN{...지만 여전히 읽을 수 없습니다.

세부사항은 다음과 같습니다:

터미널에서 .gtf예상대로 파일의 부분 집합을 설정할 수 있습니다. 에서 가져옴여기:

awk '{if($1=="chr22" && $4>21799011 && $5<21807847 && $3=="exon") print $0}' GRCh38.gtf

예상대로 작동합니다.

그러나 이 작업을 수행하기 위해 파일을 반복하면 출력이 없습니다.

while read line; do

        # stage coordinates to pull gtf info
        chr_tmp=$(echo $line | awk '{print $1}')
        chr=$(echo $chr_tmp | sed 's/^/"/;s/$/"/') # echo prints "chr22"
        st=$(echo $line | awk '{print $2}')
        sp_tmp=$(echo $line | awk '{print $3}')
        sp=$(($sp_tmp + 1))
        name=$(echo $line | awk '{print $5}')
        
        awk -v chr="$chr" -v st="$st" -v sp="$sp" 'BEGIN {if($1==chr && $4>st && $5<sp && $3=="exon") print $0}' GRCh38.gtf > ${name}.gtf

done < circ.bed

쉘에서 변수를 수동으로 할당하면 awk가 예상대로 인쇄하기 때문에 이것은 이상합니다.

barry@NUIG:~/Desktop/BED12$ echo $chr
"chr22"
barry@NUIG:~/Desktop/BED12$ echo $st
21799011
barry@NUIG:~/Desktop/BED12$ echo $sp
21807846
barry@NUIG:~/Desktop/BED12$ awk -v chr="$chr" -v st="$st" -v sp="$sp" 'BEGIN {print chr, st, sp}'
"chr22" 21799011 21807846

그러나 스크립트 외부에서는 작동하지 않습니다.

awk -v chr="$chr" -v st="$st" -v sp="$sp" 'BEGIN{if($1==chr && $4 > st && $5 < sp) print $0}' GRCh38.gtf

awk 명령에 넣으면 출력이 없습니다. 어쩌면 사실을 $1=="chr22"따옴표로 묶어야 하는데 그게 이상할까요? 또한 큰따옴표 없이 시도했지만 -v chr=$chr아무 BEGIN소용이 없습니다.

답변1

awk이는 에서 변수 $1등 이 각 레코드에서 감지된 필드(즉, 첫 번째 필드)의 값을 $2참조하기 때문입니다 .$1

BEGIN코드 블록은 END구문 분석을 위해 데이터를 읽기 전과 후에 각각 실행됩니다.

코드 블록 에서는 BEGIN아직 데이터를 읽지 않았으므로 필드 변수가 채워지지 않으므로 모든 동일성 검사가 실패합니다.

두 가지 테스트를 살펴보십시오.

$ awk -v chr="$chr" -v st="$st" -v sp="$sp" 'BEGIN {print chr, st, sp}'
"chr22" 21799011 21807846

여기서 awk변수를 쉘 변수와 동일하게 설정하고 값을 인쇄합니다. 모두 괜찮습니다.

$ awk -v chr="$chr" -v st="$st" -v sp="$sp" 'BEGIN{if($1==chr && $4 > st && $5 < sp) print $0}' GRCh38.gtf

여기에는 파일에서 읽은 데이터에 대해 작동하는 코드 블록이 없습니다. 단지 .gtf데이터를 읽기 전에 블록의 필드와 비교하는 것뿐입니다.BEGIN

다음을 수행할 수 있습니다.

$ awk -v chr="$chr" -v st="$st" -v sp="$sp" '{if($1==chr && $4 > st && $5 < sp) print $0}' GRCh38.gtf

체크섬 문이 더 이상 블록 print에 없기 때문에 검사가 실행되고 파일의 각 줄에 대한 데이터가 인쇄됩니다 .BEGIN

또한 실행 블록 외부에서 검사를 가져와 검사가 유효한 경우에만 해당 줄을 처리(이 경우 인쇄)하도록 했습니다.

$ awk -v chr="$chr" -v st="$st" -v sp="$sp" '$1==chr && $4 > st && $5 < sp {print $0}' GRCh38.gtf

답변2

답장을 보내주셔서 감사합니다. 죄송합니다. 모든 사람에게 투표하기에는 내 대표성이 너무 낮습니다.

awk -v chr="$chr" -v st="$st" -v sp="$sp" '$1==chr && $4 > st && $5 < sp {print $0}' GRCh38.gtf

&

awk -v chr="$chr" -v st="$st" -v sp="$sp" '{if($1==chr && $4 > st && $5 < sp) print $0}' GRCh38.gtf

이미 작업 중입니다.

BEGIN스크립트(및 사용법)의 실수는 awk가 chr변수를 따옴표로 묶기를 원한다고 생각한 것입니다. 왜냐하면 터미널에서는 다음 줄이 작동했기 때문입니다.

awk '{if($1=="chr22" && $4>21799011 && $5<21807847 && $3=="exon") print $0}' GRCh38.gtf

이것은 다음을 수행하지 않습니다.

awk '{if($1==chr22 && $4>21799011 && $5<21807847 && $3=="exon") print $0}' GRCh38.gtf

관련 정보