オンラインでたくさんの投稿を読んでい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
まだデータを読み取っていないため、フィールド変数が埋められていないため、すべての同一性チェックが失敗します。
2つのテストを見てください。
$ 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