web-dev-qa-db-fra.com

La valeur absolue dans awk ne fonctionne pas?

Je veux sélectionner la ligne d'un fichier où la valeur absolue de la colonne 9 est inférieure à 500. La colonne est parfois positive, parfois négative.

awk -F'\t' '{ if ($9 < |500|) {print $0} }' > output.bam

Cela ne fonctionne pas jusqu'à présent .. un tour sur Internet m'a dit que pour utiliser la valeur absolue, nous devrions ajouter

func abs(x) { return (x<0) ? x*-1 : x }

Alors, comment suis-je supposé mettre cela avec la valeur de la colonne 9 ?? Je ne sais pas ce qui pourrait être une syntaxe correcte ..

20
madkitty
awk -F'\t' 'function abs(x){return ((x < 0.0) ? -x : x)} {if (abs($9) < 500) print $0}'
28
Kane

Pour les one-liners rapides, j'utilise cette approche:

awk -F'\t' 'sqrt($9*$9) < 500' > output.bam

La saisie est rapide, mais pour les gros travaux, j'imagine que sqrt () imposerait un impact négatif sur les performances.

18
TheAmigo

Est-ce trop évident et/ou pas élégant?

awk -F'\t' '$9 < 500 && $9 > -500' > output.bam
2
champost

Il y a une perte de précision en utilisant sqrt (9 $ ^ 2). Cela peut poser problème si vous souhaitez également imprimer la valeur absolue.

Solution : traite en tant que texte et supprime simplement le signe moins, le cas échéant. 

Cela garantit que la sortie correspond exactement à l'entrée.

Code :

awk '{sub("^-", "", $9); if ($9 < 500) print $9}' inputfile

Résumé : pour obtenir une valeur absolue à l'aide de awk, supprimez simplement le caractère moins (-) du champ, s'il est présent.

1
Romwell