如何解决 awk 脚本中的问题?

如何解决 awk 脚本中的问题?

我使用 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 的结果是致命:尝试除以零。这就是为什么我想在输出的第三列中看到 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

我该如何解决这个问题?

欢迎任何贡献!

答案1

你就快到了。使用这个 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

您所需要的只是一个三元表达式:

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

相关内容