Awk 当第二列变为非零时,从底部向上计数行

Awk 当第二列变为非零时,从底部向上计数行,awk,Awk,以下是gnuplot文件的子集,时间单位为秒,时间单位为1/1/2000,日降雨量单位为毫米: 559008000 13.500000 559094400 2.4000001 559180800 0.60000002 559267200 13.800000 559353600 6.3000002 559440000 0.30000001

以下是gnuplot文件的子集,时间单位为秒,时间单位为1/1/2000,日降雨量单位为毫米:

        559008000   13.500000    
        559094400   2.4000001    
        559180800  0.60000002    
        559267200   13.800000    
        559353600   6.3000002    
        559440000  0.30000001    
        559526400   0.0000000    
        559612800   0.0000000    
        559699200   0.0000000    
        559785600   0.0000000    
我想找出自下雨以来的天数(4天)。 第一步是反转文件:

tac rainfile.txt
现在我在第2列中查找第一个非零条目

tac rainfile.txt | awk '$2 == "0.0000000" {++count} END {print count}'

给我零行的总数,但是当我第一次碰到非零值时如何停止计数?

你可以
grep
你想要的行,并通过
tail
获得最后一行:

grep '^ *[0-9]\+  [0-9.]*[1-9][0-9.]*' input | tail -1
这使得:

559440000  0.30000001
要获取行号,请执行以下操作:

echo $(( $(tac in | grep -n '  [1-9][0-9.]* *$' -m 1 | cut -f1 -d:) - 1))
其中:

 4

我只需要使用
awk
,这里不需要
tac

awk '$2>0{d=0;next}{d++}END{print d}' rain.txt
tac
无论如何都需要循环浏览文件。当然,它不需要比较数字,但除非
rainfile.txt
真的很大,否则你不会觉得有什么不同。否则见下文


关于使用
tac
的初始解决方案,只需添加
next
exit
语句:

tac rain.txt | awk '$2 == "0.0000000"{++count;next}{exit}END{print count}'

请注意,
awk
将在调用
退出
后处理
结束
块。

请尝试以下操作,并告诉我这是否有帮助

awk '($2==0){count++;next} {count=0} END{print count}'  Input_file

输出将是相同的
4
。解释将很简单,检查第二个字段是否等于零,如果是,则将名为count的变量值增加到1,并使用next跳过所有进一步的语句。如果该条件在任何一行中都不满足,那么它将不会出现在该块中,并且它将使count的值为空。最后,在END bock print中读取所有行时,变量计数为4。

欢迎使用堆栈溢出,我几乎回答了您的问题。你能不能也在这里添加一次预期的输出,然后告诉我们?写这个的方法很多,但是你可以使用一个老式的代码块,比如
awk'{if($2==“0.0000000”){++count}或者{exit}END{print count}“
。祝你好运。那么我该如何计算这一行之后的行数呢?使用grep是可行的,但它不会很好。但是,你可以使用
date
@hek2mgl实际使用时间戳来计算日期差,非常感谢先生让我知道我不理解雨的含义:)这就是我问OP的原因。我编辑了我的So现在解决。如果需要任何更改,请告诉我,再次感谢。为什么设置
d=”“
?您可以使用
d=0
是!!这很有效。但我不确定为什么。我需要调查“下一步”…
next
跳过剩余的代码块(
d++
)您还可以编写第一个示例,如
awk'{d++}$2>0{d=0}END{print d}'rain.txt
,但效率稍低,因为在不需要的情况下需要增加
d