Sed - 按最后两个字符计算行数

时间:2014-01-16 13:01:16

标签: linux bash sed awk

我的输入文件:

    20110512075900 
    20110512075915 
    20110512075930  
    20110512075945  
    20110512075900  
    20110512080015
    20110512075930  
    20110512080000
    20110512075915
    20110512075945
    20110512075900
    20110512075930
    20110512075900
    20110512075915 

我想计算从'... 00'(最后两个字符)到下一个'... 00'的行数。 所以,我的输出将是:

    4
    3
    3
    2
    2

我尝试使用sed:

    nrlinii=`sed -n '/^[0-9]00/,/^[0-9]45/ p' file.txt | wc -l `

    echo $nrlinii

但是不要工作。

非常感谢你。

6 个答案:

答案 0 :(得分:3)

使用awk

$ awk '{a++} /00$/ {print a; a=0} END{print a}' file
8
3
2
1

解释

  • {a++}会递增计数器a
  • /00$/ {print a; a=0}如果该行以00结尾($表示行尾),则打印该值并重置计数器。
  • END{print a}从最后00打印计数器直至结束。

答案 1 :(得分:2)

仅使用bash:

$ i=0; while read; do [[ $i -ne 0 ]] && [[ $REPLY =~ 00\ *$ ]] && { echo $i; i=0; }; let i=$i+1; done < test.txt ; echo $i
4
3
3
2
2

但我发布此解决方案只是为了好玩,我更喜欢使用awk作为fedorqui的答案。

答案 2 :(得分:2)

这可能适合你(gnu SED&amp; Shell):

sed '1{h;d};/00\s*$/!{H;$!d};x;s/.*/echo "&" | wc -l/ep;d' file

收集保留空间中的线组。然后针对他们运行wc -l

答案 3 :(得分:1)

试试这行:

awk -v RS='[0-9]*00\n' '$0=NF+1' file

答案 4 :(得分:0)

$ awk '/00[[:space:]]*$/{ if (NR>1) print NR - prev; prev=NR}' file
4
3
3
2

答案 5 :(得分:0)

对我来说,使用哈希是一种自然的方式来计算项目。

$ awk '{
    array[substr($1, 13, 2)]++
} END {
    for (num in array) {
        print num, array[num]
    }
}' input.txt
45 2
00 5
30 3
15 4