24

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

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

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

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

那我怎么把它和第 9 列的值放在一起呢?我不知道什么可能是正确的语法..

4

4 回答 4

34
awk -F'\t' 'function abs(x){return ((x < 0.0) ? -x : x)} {if (abs($9) < 500) print $0}'
于 2012-06-25T07:20:57.673 回答
20

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

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

打字很快,但对于大型工作,我想 sqrt() 会影响性能。

于 2013-11-13T15:09:26.843 回答
4

这是否太明显和/或不优雅?

awk -F'\t' '$9 < 500 && $9 > -500' > output.bam
于 2015-05-22T17:23:24.580 回答
1

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

解决方案:处理为文本,并简单地删除前导减号(如果存在)。

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

代码

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

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

于 2018-09-10T22:59:30.783 回答