Math 两个现场分部,awk

Math 两个现场分部,awk,math,awk,Math,Awk,我一直在使用awk中的函数(可能非常简单):我试图用以下代码将两个字段逐行划分: awk 'BEGIN{FS=OFS="\t"} $43 > 0 && $31 > 0 {$43/$31; print}' file.tsv 但我不断地遇到这样的错误:致命:尝试用零除,但我已经检查过分母总是与零不同(事实上,我认为代码应该丢弃零),我不知道发生了什么。。。有什么建议吗?非常感谢 编辑:输入表具有以下格式(awk'BEGIN{FS=OFS=“\t”}{print$31,$

我一直在使用awk中的函数(可能非常简单):我试图用以下代码将两个字段逐行划分:

awk 'BEGIN{FS=OFS="\t"} $43 > 0 && $31 > 0 {$43/$31; print}' file.tsv
但我不断地遇到这样的错误:
致命:尝试用零除
,但我已经检查过分母总是与零不同(事实上,我认为代码应该丢弃零),我不知道发生了什么。。。有什么建议吗?非常感谢

编辑:输入表具有以下格式(
awk'BEGIN{FS=OFS=“\t”}{print$31,$43}”file.tsv|head-4
):

例如,
“fnord”>0
在Awk中计算为true;您确实需要确保这些值是正确的数字。强制数字解释的常见技巧是加零

awk 'BEGIN{FS=OFS="\t"} 0+$43 > 0 && 0+$31 > 0 { print $43/$31 }' file.tsv
只需
打印
始终打印
$0
(虽然您可以直接或间接从程序中更改它,但它已初始化为当前输入行);要打印其他内容,请将“其他内容”作为参数传递给
print

,例如
“fnord”>0
在Awk中计算为true;您确实需要确保这些值是正确的数字。强制数字解释的常见技巧是加零

awk 'BEGIN{FS=OFS="\t"} 0+$43 > 0 && 0+$31 > 0 { print $43/$31 }' file.tsv

只需
打印
始终打印
$0
(虽然您可以直接或间接从程序中更改它,但它已初始化为当前输入行);要打印其他内容,请将该“其他内容”作为参数传递给
print

标题中的零除结果,该标题中没有字段的数字,因此两个字段都为零。要实现这一点,您需要跳过标题(
NR==1
tests用于第一行)


被零除的结果来自没有字段编号的标题,因此两个字段都为零。要实现这一点,您需要跳过标题(
NR==1
tests用于第一行)


部门不会导致打印任何内容;您是否希望将该值视为输出的一部分?到底是哪一部分?@tripleee,我以为输出是直接的除法结果。。。我也试过这样做:
awk'BEGIN{FS=OFS=“\t”}$43>0&&$31>0{div=$43/$31;print div}'
但错误并没有消失。当然不是;只是想弄清楚你期望的结果是什么。您能否以明确的形式打印第一对值的值,以帮助我们了解您的输入是什么样子的?您能否使用包含两列的单行文件复制它?如果是这样的话,给我们看一下文件。这是因为页眉。除法不会导致打印任何内容;您是否希望将该值视为输出的一部分?到底是哪一部分?@tripleee,我以为输出是直接的除法结果。。。我也试过这样做:
awk'BEGIN{FS=OFS=“\t”}$43>0&&$31>0{div=$43/$31;print div}'
但错误并没有消失。当然不是;只是想弄清楚你期望的结果是什么。您能否以明确的形式打印第一对值的值,以帮助我们了解您的输入是什么样子的?您能否使用包含两列的单行文件复制它?如果是这样,请向我们显示该文件。这是因为标题。它似乎工作正常,谢谢!还有一个问题:由于除法前后元素的数量变化很大,我如何才能将这些零行保留为空行。再次感谢!您的意思是打印一个空行,其中这些值不是数字且大于零?添加类似于
的内容;下一个}{打印“”
在最后一个右大括号之前。它似乎工作正常,谢谢!还有一个问题:我怎样才能将这些零行保留为空行,因为除法前后的元素数量变化很大。再次感谢!你的意思是打印一个空行,其中这些值不是数字且大于零?添加类似于
;next}的内容{在最后一个右大括号之前打印“”
$ awk 'NR==1{print "$43/$31"; next} $43>0 && $31>0 {print $43/$31}' file