2012-06-25 9 views
20

Desidero selezionare la riga di un file in cui il valore assoluto della colonna 9 è inferiore a 500. La colonna è a volte positiva, a volte negativa.Il valore assoluto in awk non funziona?

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

Questo non funziona così lontano .. un giro su internet mi ha detto che per utilizzare il valore assoluto dobbiamo aggiungere

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

Allora come sono io suppongo di mettere questo insieme al valore della colonna 9 ?? Non so quello che potrebbe essere una sintassi corretta ..

risposta

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

Preferirei vederlo come un multi-liner invece che un one-liner, ma cosa dovrebbe funzionare. –

17

per un rapido one-liners, io uso questo approccio:

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

È veloce a digitare, ma per i grandi lavori, I' Immagina che sqrt() possa imporre un successo in termini di prestazioni.

+1

'{print}' è implicito, è possibile rilasciare quella parte. –

+5

+1; leggera semplificazione: 'sqrt ($ 9^2)' (nota l'uso di '^' piuttosto che '**' per l'esponenziazione - '**' non è conforme a POSIX). – mklement0

1

È troppo ovvio e/o non elegante?

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