【问题标题】:Arithmetic in Unix shell ScriptUnix shell 脚本中的算术运算
【发布时间】:2013-08-29 23:47:06
【问题描述】:

我想计算每行第 2 列和第 3 列的平均值,将此值加 1 并打印整行。一些平均值将是浮点数。

输入文件如下所示:

chr20 2330559 2330737
chr20 2332853 2333041
chr20 2537555 2537711

输出文件:

chr20 2330648 2330649
chr20 2332947 2332948
chr20 2537633 2537634

我尝试了各种 awk 组合,但均未成功。任何建议都会很棒! 谢谢 哈丽特

【问题讨论】:

    标签: shell math awk


    【解决方案1】:

    为此使用 awk:

    awk '{$2=($2+$3)/2; $3=$2+1}1' file
    

    也可以使用int()函数来保证结果是整数:

    awk '{$2=int(($2+$3)/2); $3=$2+1}1' file
    

    【讨论】:

    • 啊!贴完评论后,(忍者),我按下了upvote按钮,然后我发现这是我自己的答案!这里是地方......
    【解决方案2】:

    试试这个单线:

    awk '{a=($2+$3)/2;$2=a;$3=a+1}7' file
    

    它给了

    chr20 2330648 2330649
    chr20 2332947 2332948
    chr20 2537633 2537634
    

    【讨论】:

    • 以两个字符击败你:p
    • @user000001 sed 's/vim/awk/' <<< "Real Vim ninjas count every keystroke - do you?" :)
    【解决方案3】:

    类似:

    awk '{ printf("%s %d %d", $1, ($2 + $3) / 2, ($2 + $3) / 2 + 1) }'
    

    您没有说明当平均值不是整数时应该发生什么。

    【讨论】:

    • 如果平均值不是整数,我仍然希望将其打印为整数或向下舍入。谢谢
    • @user1879573 为此使用int() 函数
    • @user1879573 在这种情况下,我的答案已经向下舍入到最接近的整数。
    猜你喜欢
    • 2011-03-02
    • 2019-12-16
    • 2010-09-05
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多