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 ..
awk -F'\t' 'function abs(x){return ((x < 0.0) ? -x : x)} {if (abs($9) < 500) print $0}'
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.
Est-ce trop évident et/ou pas élégant?
awk -F'\t' '$9 < 500 && $9 > -500' > output.bam
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.