#!/usr/bin/perl -w

# count - equivalent of "sort | uniq -c | sort -nr"
#
# Copyright (C) 2004  Daniel Quinlan
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

use vars qw($opt_x);
use Getopt::Std;
getopts("x");

while(<>) {
	if ($opt_x) {
		chomp;
		my @array = unpack('C*', $_);
		$_ = '';
		foreach my $c (@array) {
			$_ .= sprintf('%2.2x ', $c);
		}
		s/\s$/\n/;
	}
	$lines{$_}++;
}

for $key (keys %lines) {
	push(@lines, $lines{$key} . "\t" . $key);
}

@lines = sort byline @lines;

for (@lines) {
	print $_;
}

sub byline {
	@a = split(/\t/, $a, 2);
	@b = split(/\t/, $b, 2);
	$ret = $a[0] <=> $b[0];
	return $ret if $ret;
	return $a[1] cmp $b[1];
}
