awk中的绝对值不起作用?

时间:2012-06-25 07:12:47

标签: awk absolute

我想选择第9列的绝对值小于500的文件行。列有时是正数,有时是负数。

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

到目前为止这不起作用..互联网上的一轮告诉我要使用绝对值我们应该添加

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

那么我怎么想把它与第9列的值一起?我不知道什么是正确的语法..

4 个答案:

答案 0 :(得分:29)

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

答案 1 :(得分:18)

对于快速单行,我使用这种方法:

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

键入速度很快,但对于大型工作,我想象sqrt()会对性能造成影响。

答案 2 :(得分:3)

这太明显了和/或不优雅吗?

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

答案 3 :(得分:1)

使用sqrt($ 9 ^ 2)会降低精度。如果您还想打印绝对值,那可能是个问题。

解决方案:作为文本处理,只需删除开头的减号(如果存在)。

这保证了输出与输入完全匹配。

代码

awk '{sub("^-", "", $9); if ($9 < 500) print $9}' inputfile

摘要:要使用awk获得绝对值,只需从字段中删除前导减号(-)(如果存在)。