当前位置: 技术问答>linux和unix
关于一个shell脚本的不解之处
来源: 互联网 发布时间:2017-05-17
本文导语: 之前在python区发过这帖,需求目的是统计出连续0值出现的次数,按python来做就没什么问题,但是我转成shell实现,却遇到了一个不解的地方. 文本内容如下: =================== 0 0 590 0 0 1045 2251 1469 0 0 0 0 4396 0 0 4799 0 0 0 0 0 0 0 0 0 ...
之前在python区发过这帖,需求目的是统计出连续0值出现的次数,按python来做就没什么问题,但是我转成shell实现,却遇到了一个不解的地方.
文本内容如下:
===================
0
0
590
0
0
1045
2251
1469
0
0
0
0
4396
0
0
4799
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
============
目的是统计出连续0值出现的次数.理论应该输出这样的结果:
2
2
4
2
16
==============
我写的shell如下:
#!/bin/bash
#name:counter.sh
#usage: count for 0
#set variable
filename="counter.txt"
#read file
counter=0
cat $filename | while read LINE
do
LineText=$LINE
if [ $LineText -eq 0 ]
then
counter=$(($counter+1))
elif [ $counter -gt 0 ]
then
echo $counter
counter=0
fi
done
#test the last counter if>0 print
if [ $counter -gt 0 ]
then
echo $counter
fi
===
最后在done之外echo了counter 的值得,发现竟然是0,求教
文本内容如下:
===================
0
0
590
0
0
1045
2251
1469
0
0
0
0
4396
0
0
4799
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
============
目的是统计出连续0值出现的次数.理论应该输出这样的结果:
2
2
4
2
16
==============
我写的shell如下:
#!/bin/bash
#name:counter.sh
#usage: count for 0
#set variable
filename="counter.txt"
#read file
counter=0
cat $filename | while read LINE
do
LineText=$LINE
if [ $LineText -eq 0 ]
then
counter=$(($counter+1))
elif [ $counter -gt 0 ]
then
echo $counter
counter=0
fi
done
#test the last counter if>0 print
if [ $counter -gt 0 ]
then
echo $counter
fi
===
最后在done之外echo了counter 的值得,发现竟然是0,求教
|
试试改成这样:
#!/bin/bash
#name:counter.sh
#usage: count for 0
#set variable
filename="counter.txt"
#read file
counter=0
while read LINE
do
LineText=$LINE
if [ $LineText -eq 0 ]
then
counter=$(($counter+1))
elif [ $counter -gt 0 ]
then
echo $counter
counter=0
fi
done 0 print
if [ $counter -gt 0 ]
then
echo $counter
fi
|
cat | while 这种方式会启动一个 sub shell
|
说的很正确,好多人shell输出不正确结果,都是因为管道产生了sub shell。
楼主,你这么写麻烦了。
一行就可以搞定:
awk 'BEGIN{n=0;} {if(0 == $1) n++; else { if(0!=n) print n; n=0;}} END{print n;}' counter.txt