计算十年出现次数

时间:2012-01-10 22:21:50

标签: python perl unix awk grep

infile中:

1   3
2   3
3   3
4   3
8   3
9   3
12  3
14  3
18  3
19  3
20  3
25  3
26  3
27  3
28  3
30  3
31  3
32  3
36  3
38  3
101 3
109 3

一旦我知道一个班轮来计算十年的发生率。例如。 5月30日...... 我希望你现在做。一个python脚本会很棒。

期望的输出:

0    6
1    4
2    5
3    4
10    2

11 个答案:

答案 0 :(得分:5)

使用Perl,使用哈希:

use warnings;
use strict;

my %decs;
while (<DATA>) {
    my ($n) = /([0-9]+)/;
    my $x = int($n / 10);
    $decs{$x}++;
}
print "$_ $decs{$_}\n" for sort { $a <=> $b } keys %decs;

__DATA__
1   3
2   3
3   3
4   3
8   3
9   3
12  3
14  3
18  3
19  3
20  3
25  3
26  3
27  3
28  3
30  3
31  3
32  3
36  3
38  3
101 3
109 3

输出:

0 6
1 4
2 5
3 5
10 2

答案 1 :(得分:2)

awk一行代表 -

awk '{x=$1/10; a[int(x)]++} END{for(i in a) print i,a[i] | "sort -n"}' INPUT_FILE

测试:

[jaypal:~/Temp] cat file
1   3
2   3
3   3
4   3
8   3
9   3
12  3
14  3
18  3
19  3
20  3
25  3
26  3
27  3
28  3
30  3
31  3
32  3
36  3
38  3
101 3
109 3

[jaypal:~/Temp] awk '{x=$1/10; a[int(x)]++} END{for(i in a) print i,a[i] | "sort -n"}' file
0 6
1 4
2 5
3 5
10 2

答案 2 :(得分:0)

我不太了解你在这里尝试做什么,但我认为你正在寻找一些简单的事情

from collections import defaultdict
decades = defaultdict(int)
for line in open('infile.txt', 'r'):
    decades[int(line.split()[0]) / 10] += 1
for decade, count in decades:
    print "%s people in their %s0s" % (count, decade * 10)

答案 3 :(得分:0)

如果我理解正确的话:

perl -ne '{use integer; $i{$_/=10}++} END{ map { print $_*10," : $i{$_}\n" } sort keys %i }'

答案 4 :(得分:0)

我认为这个python模块可以满足您的需求:

import sys
import math
from collections import OrderedDict 

def count_decades( infile ):
    decade_counts = OrderedDict()
    for line in infile:
        number = int( line.split( ' ' )[ 0 ] )
        decade_index = int( math.floor( number / 10 ) )
        decade_counts[ decade_index ] = decade_counts.get( decade_index, 0 ) + 1
    return decade_counts

if __name__ == '__main__':    
    with open( sys.argv[ 1 ], 'r' ) as infile:
        decade_counts = count_decades( infile )        
        for key, count in decade_counts.items():
            print( "{} - {} occurs {} times".format( 
                key * 10 , key * 10 + 9, count ) )

当这样调用时:

python occur.py decades.txt

结果是:

0 - 9 occurs 6 times
10 - 19 occurs 4 times
20 - 29 occurs 5 times
30 - 39 occurs 5 times
100 - 109 occurs 2 times

您可能需要不同的输出,但应该很容易定制......

更新:

对于OP所需的输出变化:

print( "{} - {} occurs {} times".format( 
                key * 10 , key * 10 + 9, count ) )

print( "{} {}".format( 
                key , count ) )

答案 5 :(得分:0)

在Python 2.7中:

from collections import Counter
c = Counter(int(line.split()[0]) // 10 for line in open("infile"))
for k, v in sorted(c.iteritems()):
    print k, v

答案 6 :(得分:0)

其他perl解决方案:

perl -ane '
  $h{ int( $F[0] / 10 ) }++;
  END {
    for $num ( sort { $a <=> $b } keys %h ) {
      printf qq[%d\t%d\n], $num, $h{ $num }
    }
  }
' file

结果:

0       6
1       4
2       5
3       5
10      2

答案 7 :(得分:0)

一行Python itertools解决方案(适用于Python&gt; = 2.4):

>>> from itertools import groupby
>>> sorted((key, len(list(group))) for key, group in groupby(
...        int(line.split()[0]) // 10 for line in open('infile')))
[(0, 6), (1, 4), (2, 5), (3, 5), (10, 2)]

答案 8 :(得分:0)

这是Perl中的一个简短的:)

perl -nE 'END{say"$_\t$h{$_}"for sort{$a<=>$b}keys%h}++$h{$_/5>>1}' input.txt
0       6
1       4
2       5
3       5
10      2

答案 9 :(得分:0)

这可能对您有用:

sed 's/\S\s*\S*$//;s/^$/0/' file | uniq -c | sed 's/\s*\(\S*\)\s\(\S*\)/\2\t\1/'
0       6
1       4
2       5
3       5
10      2

看起来您的数据是如何排序的,如果不是这样插入sort -n

sed 's/\S\s*\S*$//;s/^$/0/' file | sort -n | uniq -c | sed 's/\s*\(\S*\)\s\(\S*\)/\2\t\1/'

答案 10 :(得分:0)

另一种方法:

perl -ne '$h{$.=$_/10}++}{print"$_ $h{$_}\n"for sort{$a-$b}keys%h' infile.txt

输出:

0       6
1       4
2       5
3       5
10      2

如果有-Esay,可以进一步缩短。