awkスクリプトの問題を修正するにはどうすればよいですか?
Aug 21 2020
bcftoolsを使用して取得した次のデータセットがあります。
$ bcftools query -f '%CHROM %POS %REF %ALT %AN %AC \n' fname.vcf
CHROM POS REF ALT AN AC
6 85406127 T A 6 2
6 85406180 T G 6 5
6 85406187 T G 6 1
-
-
-
6 85434019 T A 0 0
6 85434075 A C 0 0
次のコマンドを使用して、目的の出力を取得します。
bcftools query -f '%CHROM %POS %REF %ALT %AN %AC \n' fname.vcf | awk '$5 !=0' | awk '{printf "%s:%s %s:%s %f\n", $1, $2, $3, $4,$6/$5}'
6:85406127 T:A 0.333333
6:85406139 T:C 0.000000
6:85406180 T:G 0.833333
データセットでは、5番目と6番目の列にゼロが含まれています。したがって、0を0で割ると、致命的となります。ゼロによる除算が試行されます。そのため、出力の3番目の列にNAを表示したいと思います。
6:85406127 T:A 0.333333
6:85406139 T:C NA
6:85406180 T:G 0.833333
出力を取得するための私の試みを以下に示しました。
bcftools query -f '%CHROM %POS %REF %ALT %AN %AC \n' fname.vcf | awk '{ if [[ $5!= 0 && $6!=0 ]]
'{printf "%s:%s %s:%s %f\n", $1, $2, $3, $4,$6/$5}'
else
'{printf "%s:%s %s:%s %b\n", $1, $2, $3, $4, 'NA'}'
}'
しかし、私はこの結果を受け取りました:
awk: cmd. line:1: { if [[ $5!= 0 && $6!=0 ]]
awk: cmd. line:1: ^ syntax error
awk: cmd. line:1: { if [[ $5!= 0 && $6!=0 ]]
awk: cmd. line:1: ^ syntax error
awk: cmd. line:2: {printf
awk: cmd. line:2: ^ unexpected newline or end of string
この問題を修正するにはどうすればよいですか?
どんな貢献も歓迎します!
回答
2 ferranm Aug 20 2020 at 22:26
あなたはほとんどそこにいました。このawkを使用してください:
awk '{ if ($5!= 0 && $6!= 0) {printf "%s:%s %s:%s %f\n", $1, $2, $3, $4,$6/$5} else {printf "%s:%s %s:%s NA\n", $1, $2, $3, $4} }'
'NA'文字列は、printf
文字列自体の一部です。また、{ *statemet* }
中には入れません'
また、AWK内でbash
計算([[ ]]
)を混在させないでください。
ここでAWK文法を簡単に確認できます
2 EdMorton Aug 21 2020 at 06:16
必要なのは三項式です。
bcf... | awk 'NR>1{printf "%s:%s %s:%s %s\n", $1, $2, $3, $4, ($5 ? $6/$5 : "NA")}'
あなたはそれで割っていないので、そうで$6
ある0
かどうかは関係ありません。
見てください(私が持っていないcat file
あなたのbcf...
コマンドの代わりに使用して):
$ cat file CHROM POS REF ALT AN AC 6 85406127 T A 6 2 6 85406180 T G 6 5 6 85406187 T G 6 1 6 85434019 T A 0 0 6 85434075 A C 0 0 $ cat file | awk 'NR>1{printf "%s:%s %s:%s %s\n", $1, $2, $3, $4, ($5 ? $6/$5 : "NA")}'
6:85406127 T:A 0.333333
6:85406180 T:G 0.833333
6:85406187 T:G 0.166667
6:85434019 T:A NA
6:85434075 A:C NA