Как исправить проблему в скрипте 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 приводит к фатальному результату : попытка деления на ноль . Вот почему я хочу видеть НП в третьем столбце вывода.

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* }внутрь'

Также не следует смешивать bashвычисления ( [[ ]]) внутри AWK.

Вы можете быстро проверить грамматику 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