awk absolute

¿El valor absoluto en awk no funciona?



absolute (4)

Quiero seleccionar la línea de un archivo donde el valor absoluto de la columna 9 es menor que 500. La columna es a veces positiva, a veces negativa

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

Esto no funciona hasta ahora ... una ronda en internet me dijo que para usar el valor absoluto deberíamos agregar

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

Entonces, ¿cómo se supone que debo poner esto junto con el valor de la columna 9? No sé qué podría ser una sintaxis adecuada ..


¿Es esto demasiado obvio y / o no elegante?

awk -F''/t'' ''$9 < 500 && $9 > -500'' > output.bam


Hay una pérdida de precisión al usar sqrt ($ 9 ^ 2). Eso podría ser un problema si también desea imprimir el valor absoluto.

Solución : procese como texto y simplemente elimine el signo menos inicial, si está presente.

Esto garantiza que la salida coincida exactamente con la entrada.

Código :

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

Resumen : para obtener el valor absoluto utilizando awk, simplemente elimine el carácter menos (-) inicial de un campo, si está presente.


Para las rápidas de una sola línea, utilizo este enfoque:

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

Es rápido de escribir, pero para trabajos grandes, me imagino que sqrt () impondría un impacto en el rendimiento.


awk -F''/t'' ''function abs(x){return ((x < 0.0) ? -x : x)} {if (abs($9) < 500) print $0}''