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

Linux Sed-按最后两个字符计数行,linux,bash,sed,awk,Linux,Bash,Sed,Awk,我的输入文件: 20110512075900 20110512075915 20110512075930 20110512075945 20110512075900 20110512080015 20110512075930 20110512080000 20110512075915 20110512075945 20110512075900 20110512075930

我的输入文件:

    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
但是不要工作

事先非常感谢。

对于awk:

解释 {a++}递增计数器a。 /00$/{print a;a=0}如果行以00$结束表示行结束,则打印值并重置计数器。 END{print a}打印从最后一个00到最后一个00的计数器。 仅使用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的答案。

这可能适用于gnu SED和Shell:

sed '1{h;d};/00\s*$/!{H;$!d};x;s/.*/echo "&" | wc -l/ep;d' file
收集保留空间中的多组行。然后对它们运行wc-l。

试试这一行:

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

对我来说,使用散列是一种计算项目的自然方式

$ 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

SED不是最好的选项,为什么在你预期的输出端Touxman后面有一个尾部2,如果你的问题已经解决了,考虑接受一个给定的答案。+ 1为优雅,但它也计数到第一行00行;OSX用户注意:在那里不起作用,因为RS不支持正则表达式。@mklement0是的,第一个00行已计算在内。它可以被修复。我没有,因为我认为它可能是正确的。。。关于OSX。。这个问题被贴上了linux标签。是的,我们需要呆呆地看一看。完全理解Linux;我提到它的唯一原因是为了其他OSX用户的利益,他们大概和我一样,也经常从Linux答案中获益。因为这并不总是有效的,所以知道什么时候不起作用是很有帮助的;OP的输入数据具有不一致的尾随空格,这可能是示例输出与OP不同的原因。这是一个不计算第一个00行之前的行的版本:awk'{a++}/00\s*$/{if numblocks++print a;a=0}END{print a}文件。要不计算最后00行之后的行数,请删除结尾{print a}。非常感谢!这对我来说是最好的解决办法。请原谅我的打扰,但我想让你帮我解决另一个问题。如果$i>=3,我只想保留带有“…00”的行,并删除其他行;如果$i<3,同样做,但将'9999'放在第二列。因此输出如下:20110512075900 20110512075900 20110512080000 20110512075900 9999 201105120759009999@tuxman:你应该打开一个新的帖子来发布你想做的事情,因为你应该在提问之前尝试。这样,我们就可以回答问题,而不必提供有限且无法阅读的评论;
$ awk '/00[[:space:]]*$/{ if (NR>1) print NR - prev; prev=NR}' file
4
3
3
2
$ 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