Awk 当第二列变为非零时,从底部向上计数行
以下是gnuplot文件的子集,时间单位为秒,时间单位为1/1/2000,日降雨量单位为毫米: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
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
。