2012-06-25 35 views
20

Tôi muốn chọn dòng của một tệp có giá trị tuyệt đối của cột 9 nhỏ hơn 500. Cột đôi khi dương, đôi khi âm.Giá trị tuyệt đối trong awk không hoạt động?

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

này không hoạt động cho đến nay .. một vòng trên internet nói với tôi rằng để sử dụng các giá trị tuyệt đối chúng ta nên thêm

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

Sau đó, làm thế nào tôi giả sử đặt này cùng với các giá trị của cột 9 ?? Tôi không biết những gì có thể là một cú pháp thích hợp ..

Trả lời

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

Tôi muốn thấy rằng đó là một lớp lót nhiều thay vì một lớp lót, nhưng những gì sẽ có hiệu quả. –

17

Đối nhanh chóng một lớp lót, tôi sử dụng phương pháp này:

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

Đó là nhanh chóng để gõ, nhưng đối với các công việc lớn, tôi d tưởng tượng rằng sqrt() sẽ áp đặt một hit hiệu suất.

+1

'{print}' được ngụ ý, bạn có thể thả phần đó. –

+5

+1; đơn giản hóa nhỏ: 'sqrt ($ 9^2)' (lưu ý việc sử dụng '^' thay vì '**' cho lũy thừa - '**' không tuân thủ POSIX). – mklement0

1

Điều này quá rõ ràng và/hoặc không thanh lịch?

awk -F'\t' '$9 < 500 && $9 > -500' > output.bam 
Các vấn đề liên quan