当第二列变为非零时,从底部开始计数

时间:2017-09-28 03:56:46

标签: awk

以下是gnuplot文件的子集,时间以2000年1月1日为单位,每日降雨量为mm:

        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}'

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

3 个答案:

答案 0 :(得分:2)

我只想使用awk,此处不需要tac

awk '$2>0{d=0;next}{d++}END{print d}' rain.txt
无论如何,

tac需要遍历文件。当然,它不需要比较数字,但除非rainfile.txt真的很大,否则你应该感觉不到。否则见下文......

关于使用tac的初始解决方案,只需添加nextexit声明:

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

请注意,awk会在调用END后处理exit阻止。

答案 1 :(得分:1)

如果有帮助,请您试试并告诉我。

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

输出为4。解释很简单,检查是否有任何第二个字段等于零,如果是,则将名为count的变量值增加到1,然后使用next跳过所有进一步的语句。如果这个条件在任何行中都不满足,那么它就不会进入这个块,它将使count的值无效。最后,当在END中读取所有行时,bock打印变量count,即4。

答案 2 :(得分:-1)

您可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