온라인에서 많은 게시물을 읽었 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