【问题标题】:Absolute value in awk doesn't work?awk 中的绝对值不起作用?
【发布时间】:2012-06-26 10:44:34
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: awk absolute


    【解决方案1】:
    awk -F'\t' 'function abs(x){return ((x < 0.0) ? -x : x)} {if (abs($9) < 500) print $0}'
    

    【讨论】:

    • 我更愿意将其视为多线而不是单线,但应该可以。
    【解决方案2】:

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

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

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

    【讨论】:

    • {print} 是隐含的,您可以删除该部分。
    • +1;略微简化:sqrt($9^2)(注意使用^ 而不是** 进行求幂 - ** 不符合 POSIX)。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      代码

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

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

      【讨论】:

        猜你喜欢
        • 2020-12-23
        • 2018-03-28
        • 1970-01-01
        • 2011-04-19
        • 1970-01-01
        • 2018-01-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多