2

我有一个制表符分隔的文件,看起来像这样:

foo 0 4

boo 3 2

blah 4 0

flah 1 1

我正在尝试计算每行两列之间的 log2。我的问题是除以零我尝试过的是:

cat file.txt | awk -v OFS='\t' '{print $1, log($3/$2)log(2)}' 

当分母为零时,awk会崩溃。我想做的是某种条件语句,当分母等于 0 时,它会打印一个“inf”作为结果。

我真的不知道该怎么做?任何帮助将不胜感激谢谢

4

2 回答 2

2

您可以按如下方式实现(通过一些额外的调整):

awk 'BEGIN{OFS="\t"} {if ($2==0) {print $1, "inf"} else {print $1, log($3/$2)log(2)}} file.txt

解释:

  • if ($2==0) {print $1, "inf"} else {...}- 首先检查第二个字段 ( $2) 是否为零。如果是,则打印$1inf继续下一行;否则照常进行。
  • BEGIN{OFS="\t"}-OFS在 awk 脚本中设置;主要是偏好的东西。
  • ... file.txt- 当您将它指定为参数时,awk 可以从文件中读取;这节省了 cat 进程的使用。(见UUCA
于 2012-12-03T16:41:03.250 回答
1
awk -F'\t' '{print $1,($2 ? log($3/$2)log(2) : "inf")}' file.txt
于 2012-12-03T17:11:10.820 回答