【问题标题】:Dealing with variable inside awk result division by zero处理 awk 结果除以零内的变量
【发布时间】:2019-01-08 08:33:36
【问题描述】:

我正在用awk写一个简单的shell命令,如下:

input_folder='/home/Desktop/files'
results_folder='/home/results'

for entry in $input_folder/*
do

re=$(samtools view -H $entry | grep -P '^@SQ' | cut -f 3 -d ':' | awk '{sum+=$1} END {print sum}')

echo -e "$(samtools depth $entry | awk '{sum+=$3} END { print $(sum/$re)}')\t/$entry" >> $results_folder/Results.txt

done

变量re 中的结果是一个数字,但是将re 的结果用于第二个命令print $(sum/$re)}' 给我这个错误 awk: cmd. line:1: (FILENAME=- FNR=312843568) fatal: division by zero attempted

我试着不把$和变量放在一起,但同样的错误。

请问有什么帮助吗?

【问题讨论】:

    标签: shell awk fatal-error division divide-by-zero


    【解决方案1】:

    awk 部分更改为:

    awk -v re="$re" '{sum+=$3} END { if(re) print sum/re; else print "oo";}'
    

    您必须使用-v 将变量传输到awk
    而且最好检查re 是否为零。
    我用oo代表Infinity symbol

    【讨论】:

    • 恕我直言,它仍然可能会出现错误,例如尝试从 0 开始除以等,因为这里没有执行检查以检查 re 的值。
    • @RavinderSingh13 已更新。感谢您的建议。
    • @RavinderSingh13 我没想到,谢谢 :)
    【解决方案2】:

    我不清楚你为什么将echo 命令的输出发送到awk。您实际的awk 命令应该是为了避免您的错误(其中它告诉您将它除以零)。尝试将您的awk 程序更改为关注一次?

    awk -v re="$re" '{sum+=$3} END {if(re){print (sum/re)} else {print "Please check seems value of re is ZERO else you will get an error from awk program}}'
    

    【讨论】:

      【解决方案3】:

      将 bash 变量放入 awk 即可完成工作:

      awk '{sum+=$3} END { print(sum/'${re}') }'
      

      在传递给 awk 之前,最好在 bash 中检查 ${re} 以进行非零检查。

      【讨论】:

      • 恕我直言,这不会以两种方式起作用。第一个-在awk bash 变量不能以这种方式传递第二个没有条件检查re 这里的值。
      • @RavinderSingh13 好吧,你可以这样传递它,但这是一个不好的方法:)
      猜你喜欢
      • 2021-12-19
      • 1970-01-01
      • 2019-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-08
      • 2018-10-02
      • 1970-01-01
      相关资源
      最近更新 更多