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まだデータを読み取っていないため、フィールド変数が埋められていないため、すべての同一性チェックが失敗します。

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

おすすめ記事