¿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}''