以下是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}'
给出了零行的总行数,但是当我第一次达到非零值时如何停止计数呢?
答案 0 :(得分:2)
我只想使用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
会在调用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