Quiero para seleccionar la línea de un archivo en el que 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 utilizar el valor absoluto debemos agregar

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

Entonces, ¿cómo estoy yo supongo que para poner esto junto con el valor de la columna 9?? No sé lo que podría ser una sintaxis correcta..

InformationsquelleAutor madkitty | 2012-06-25

4 Comentarios

  1. 29
    awk -F'\t' 'function abs(x){return ((x < 0.0) ? -x : x)} {if (abs($9) < 500) print $0}'
    • Prefiero ver esto como una multi-liner en lugar de una sola línea, pero lo que se debe trabajar.
  2. 18

    Rápida de una sola línea, yo uso este enfoque:

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

    Es rápido para escribir, pero para los grandes puestos de trabajo, me imagino que la función sqrt() impondría un impacto en el rendimiento.

    • {print} es implícita, se puede quitar esa parte.
    • +1; ligera simplificación: sqrt($9^2) (nota: el uso de ^ en lugar de ** para la exponenciación – ** no es compatible con POSIX).
  3. 1

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

    Solución: proceso como texto, y simplemente quite el principal signo de menos, si está presente.

    Esto garantiza que el resultado coincide con el de entrada exactamente.

    Código:

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

    Resumen: para obtener valor absoluto usando awk, simplemente quite el principal signo de menos (-) de caracteres de un campo, si está presente.

Dejar respuesta

Please enter your comment!
Please enter your name here