Comment résoudre le problème dans le script awk?
J'ai l'ensemble de données suivant obtenu à l'aide de 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
La sortie souhaitée est obtenue par la commande suivante:
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
Dans l'ensemble de données, il contient des zéros dans les 5e et 6e colonnes. Donc, 0 divisé par 0 donne un résultat fatal: la division par zéro est tentée . C'est pourquoi je veux voir les NA dans la troisième colonne de la sortie.
6:85406127 T:A 0.333333
6:85406139 T:C NA
6:85406180 T:G 0.833333
Ma tentative pour obtenir la sortie a été montrée ci-dessous:
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'}'
}'
Mais j'ai reçu ce résultat:
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
Comment puis-je résoudre ce problème?
Toute contribution est la bienvenue!
Réponses
Vous y étiez presque. Utilisez ce 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} }'
La chaîne «NA» fait partie de la printfchaîne elle-même. Aussi, vous ne mettez pas l' { *statemet* }intérieur'
De plus, ne mélangez pas les bashcalculs ( [[ ]]) à l'intérieur d'AWK.
Vous pouvez vérifier rapidement la grammaire AWK ici
Tout ce dont vous avez besoin est une expression ternaire:
bcf... | awk 'NR>1{printf "%s:%s %s:%s %s\n", $1, $2, $3, $4, ($5 ? $6/$5 : "NA")}'
Peu importe si $6est 0ou non puisque vous n'êtes pas en divisant par elle.
Regardez (en utilisant cat fileà la place de votre bcf...commande que je n'ai pas):
$ 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