2012-06-25 12 views
20

Chcę wybrać wiersz pliku, w którym bezwzględna wartość kolumny 9 jest mniejsza niż 500. Kolumna jest czasami dodatnia, czasami ujemna.Wartość bezwzględna w awk nie działa?

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

To nie działa tak daleko .. jedna runda w internecie powiedział mi, że do korzystania z wartości bezwzględnej należy dodać

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

Więc jak jestem przypuszczać, aby umieścić to wraz z wartością kolumny 9? Nie wiem, co może być właściwa składnia ..

Odpowiedz

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

Wolę widzieć to jako wieloliniarkę zamiast jednej liniowej, ale to, co powinno, działa. –

17

Dla szybkich jednej wkładki, używam tego podejścia:

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

To szybkie wpisywanie, ale w przypadku dużych zadań, I” d wyobraź sobie, że sqrt() narzuciłoby wydajność.

+1

'{print}' jest domyślne, możesz upuścić tę część. –

+5

+1; niewielkie uproszczenie: 'sqrt (9^2)' (zwróć uwagę na użycie '^' zamiast '**' dla potęgowania - '**' nie jest zgodne z POSIX). – mklement0

1

Czy to zbyt oczywiste i/lub nie eleganckie?

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