Absolute value in awk doesn't work?

谁说胖子不能爱 提交于 2019-12-19 05:06:46

问题


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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!