Похоже, вы хотите подсчитать количество значений в каждом диапазоне 100, 0..99, 100..199, 200..299 и т. Д., А затем найти самый большой такой диапазон.
Вы, вероятно, можете сделать это в awk
(и определенно в Python), но я собираюсь использовать Perl.
Я собираюсь жестко закодировать номер столбца в программе; это может быть изменено (например, опция в командной строке), если это необходимо. Я выбрал колонку 3, считая от 0.
#!/usr/bin/env perl
use strict;
use warnings;
use constant colno => 3;
my %ranges;
while (<>)
{
my(@fields) = split /\s+/;
my($key) = int($fields[colno] / 100);
$range{$key}++;
}
# The hash now contains the number of entries for each range that's present in the
# data. Now we need to hack the data so that we can easily find the range(s) with
# the largest counts.
# Apply the Schwartzian Transform: http://en.wikipedia.org/wiki/Schwartzian_transform
my @results = map { [$_->[0], $_->[1]] }
sort { $a->[1] <=> $b->[1] }
map { [$_, $ranges{$_}] }
keys %ranges;
# And print the results
foreach my $ref (reverse @results)
{
printf "%5d = %d\n", $ref->[0] * 100, $ref->[1];
}
Для ваших образцов данных (дополненных тремя предыдущими столбцами), вывод будет:
31400 = 4
20000 = 3
0 = 2
52400 = 2
2000 = 1
200 = 1
Преобразование Шварца - это глубокая черная магия. Это может быть не нужно здесь, но это работает. (И да, я впервые это использую.)
Код Perl был забавным (и, вероятно, довольно быстрым), но если у вас нет Perl на компьютере, вам нужна альтернатива.
awk '{value = int($3/100); print value*100;}' files |
sort |
uniq -c |
sort -nr
Код awk
выбирает столбец 3 (считая от 1, а не 0!), Делит значение на 100 и преобразует его в целое число, а затем печатает значение, умноженное на 100; это дает группировку, которую вы хотите. Оставшийся sort | uniq -c | sort -nr
конвейер - это стандартная идиома для подсчета вхождений и сортировки, так что наиболее частые появляются первыми. На самом деле, зачастую лучше не указывать r
в окончательной сортировке, чтобы последние несколько строк были наиболее интересными.