Абсолютное значение в awk не работает?

Я хочу выбрать строку файла, где абсолютное значение столбца 9 меньше 500. Столбец иногда положительный, иногда отрицательный.

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

Пока это не работает. Один раунд в Интернете сказал мне, что для использования абсолютного значения мы должны добавить

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

Тогда как мне поставить это вместе со значением столбца 9?? Я не знаю, что может быть правильным синтаксисом.


person madkitty    schedule 25.06.2012    source источник


Ответы (4)


Для быстрых однострочников я использую такой подход:

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

Это быстро набирать, но я полагаю, что для больших заданий sqrt() приведет к снижению производительности.

person TheAmigo    schedule 13.11.2013
comment
{print} подразумевается, вы можете опустить эту часть. - person Adrian Frühwirth; 13.11.2013
comment
+1; небольшое упрощение: sqrt($9^2) (обратите внимание на использование ^ вместо ** для возведения в степень - ** не соответствует POSIX). - person mklement0; 08.04.2014

Это слишком очевидно и/или не элегантно?

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

При использовании sqrt($9^2) происходит потеря точности. Это может быть проблемой, если вы хотите также напечатать абсолютное значение.

Решение: обработайте как текст и просто удалите начальный знак минус, если он есть.

Это гарантирует, что вывод точно соответствует вводу.

Код:

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

Вывод: чтобы получить абсолютное значение с помощью awk, просто удалите начальный знак минус (-) из поля, если он есть.

person Romwell    schedule 10.09.2018

person    schedule
comment
Я бы предпочел видеть это как многострочный, а не однострочный, но то, что есть, должно работать. - person Jonathan Leffler; 25.06.2012