#!perl
MAIN: {
my
$opt
= {};
get_opt(
$opt
,
@ARGV
);
swoop(
$opt
);
}
sub
swoop {
my
$opt
=
shift
;
my
%list
;
while
(
my
$stdin
= <STDIN>) {
chomp
$stdin
;
next
if
!
defined
$stdin
;
next
if
$stdin
eq
''
;
if
(
$opt
->{fields}) {
my
@f
=
split
/
$opt
->{delimiter}/,
$stdin
;
for
my
$field
(@{
$opt
->{fields}}) {
push
@{
$list
{
$field
- 1}}, normalize(
$f
[
$field
- 1]);
}
}
else
{
push
@{
$list
{0}}, normalize(
$stdin
);
}
}
my
$t
= Text::ASCIITable->new;
$t
->setCols(
''
,
qw/ elem sum max min range avg /
);
for
my
$field
(@{
$opt
->{fields}}) {
my
$swoop
= Statistics::Swoop->new(\@{
$list
{
$field
- 1}});
$t
->addRow(
$field
,
defined
$swoop
->count ?
$swoop
->count :
'-'
,
defined
$swoop
->sum ?
$swoop
->sum :
'-'
,
defined
$swoop
->max ?
$swoop
->max :
'-'
,
defined
$swoop
->min ?
$swoop
->min :
'-'
,
defined
$swoop
->range ?
$swoop
->range :
'-'
,
defined
$swoop
->avg ?
$swoop
->avg :
'-'
,
);
}
if
(
$opt
->{stderr}) {
warn
$t
;
}
else
{
print
$t
;
}
}
sub
get_opt {
my
(
$opt
,
@argv
) =
@_
;
Getopt::Long::GetOptionsFromArray(
\
@argv
,
'fields|f=s'
=> \
$opt
->{fields},
'delimiter|d=s'
=> \
$opt
->{delimiter},
'stderr'
=> \
$opt
->{stderr},
'h|help'
=>
sub
{
_show_usage(1);
},
'v|version'
=>
sub
{
print
"$0 $Statistics::Swoop::VERSION\n"
;
exit
1;
},
) or _show_usage(2);
if
(!
$opt
->{fields}) {
push
@{
$opt
->{_fields}}, 1;
}
else
{
for
my
$f
(
split
/,/,
$opt
->{fields}) {
push
@{
$opt
->{_fields}},
$f
;
}
}
$opt
->{fields} =
$opt
->{_fields};
unless
(
$opt
->{delimiter}) {
$opt
->{delimiter} =
"\t"
;
}
}
sub
normalize {
my
$value
=
shift
;
$value
=~ s/^([\d\.]+).*/$1/;
return
$value
;
}
sub
_show_usage {
my
$exitval
=
shift
;
Pod::Usage::pod2usage(
-exitval
=>
$exitval
);
}