问题
I want to select line of a file where the absolute value of column 9 is less than 500. Column is sometimes positive, sometimes negative.
awk -F'\t' '{ if ($9 < |500|) {print $0} }' > output.bam
This doesn't work so far .. one round on internet told me that to use the absolute value we should add
func abs(x) { return (x<0) ? x*-1 : x }
Then how am I suppose to put this along with the value of column 9?? I don't know what could be a proper syntax..
回答1:
awk -F'\t' 'function abs(x){return ((x < 0.0) ? -x : x)} {if (abs($9) < 500) print $0}'
回答2:
For quick one-liners, I use this approach:
awk -F'\t' 'sqrt($9*$9) < 500' > output.bam
It's quick to type, but for large jobs, I'd imagine that sqrt() would impose a performance hit.
回答3:
Is this too obvious and/or not elegant ?
awk -F'\t' '$9 < 500 && $9 > -500' > output.bam
回答4:
There is a loss of precision using sqrt($9^2). That might be a problem if you want to print the absolute value as well.
Solution: process as text, and simply remove the leading minus sign, if present.
This guarantees that the output matches the input exactly.
Code:
awk '{sub("^-", "", $9); if ($9 < 500) print $9}' inputfile
Summary: to get absolute value using awk, simply remove the leading minus (-) character from a field, if present.
来源:https://stackoverflow.com/questions/11184915/absolute-value-in-awk-doesnt-work