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
答案 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
如果有-E
和say
,可以进一步缩短。