X-Git-Url: http://git.shiar.nl/barcat.git/blobdiff_plain/86ddf3f48f705f0865390bebbef9beeacec97aa4..b8ecf0c19b1c9f899933a067a6958edf859927f8:/barcat?ds=sidebyside diff --git a/barcat b/barcat index 2acdadd..aa18957 100755 --- a/barcat +++ b/barcat @@ -1,10 +1,9 @@ #!/usr/bin/perl -CA -use 5.018; +use 5.014; use warnings; use utf8; use List::Util qw( min max sum ); use open qw( :std :utf8 ); -use experimental qw( lexical_subs ); our $VERSION = '1.06'; @@ -35,7 +34,7 @@ GetOptions(\%opt, 'hidemax=i', 'minval=f', 'maxval=f', - 'limit|L=s' => sub { + 'limit|L:s' => sub { my ($optname, $optval) = @_; $optval ||= 0; ($opt{hidemin}, $opt{hidemax}) = @@ -50,7 +49,7 @@ GetOptions(\%opt, $opt{'graph-format'} = substr $_[1], 0, 1; }, 'spark:s' => sub { - $opt{spark} = [split //, $_[1] || '▁▂▃▄▅▆▇█']; + $opt{spark} = [split //, $_[1] || ' ▁▂▃▄▅▆▇█']; }, 'palette=s' => sub { $opt{palette} = { @@ -101,7 +100,7 @@ GetOptions(\%opt, }, ) or exit 64; # EX_USAGE -$opt{width} ||= $ENV{COLUMNS} || 80; +$opt{width} ||= $ENV{COLUMNS} || qx(tput cols) || 80 unless $opt{spark}; $opt{color} //= -t *STDOUT; # enable on tty $opt{'graph-format'} //= '-'; $opt{trim} *= $opt{width} / 100 if $opt{trimpct}; @@ -112,6 +111,7 @@ $opt{'value-length'} = 1 if $opt{unmodified}; $opt{'signal-stat'} //= exists $SIG{INFO} ? 'INFO' : 'QUIT'; $opt{markers} //= '=avg >31.73v <68.27v +50v |0'; $opt{palette} //= $opt{color} && [31, 90, 32]; +$opt{input} = @ARGV && $ARGV[0] =~ m/\A[-0-9]/ ? \@ARGV : undef; my (@lines, @values, @order); @@ -133,7 +133,7 @@ if (defined $opt{interval}) { } my $valmatch = qr/$opt{anchor} ( \h* -? [0-9]* \.? [0-9]+ (?: e[+-]?[0-9]+ )? |)/x; -while (readline) { +while (defined ($_ = $opt{input} ? shift @{ $opt{input} } : readline)) { s/\r?\n\z//; s/^\h*// unless $opt{unmodified}; push @values, s/$valmatch/\n/ && $1; @@ -153,6 +153,10 @@ while (readline) { and $. % $opt{interval} == 0; } +if ($opt{'zero-missing'}) { + push @values, (0) x 10; +} + $SIG{INT} = 'DEFAULT'; sub color { @@ -236,18 +240,24 @@ while ($nr <= $#lines) { $nr >= $opt{hidemax} and last if defined $opt{hidemax}; my $val = $values[$nr]; my $rel = length $val && ($val - $minval) / ($maxval - $minval); + my $color = !length $val || !$opt{palette} ? undef : + $val == $order[0] ? $opt{palette}->[-1] : # max + $val == $order[-1] ? $opt{palette}->[0] : # min + $opt{palette}->[ $rel * ($#{$opt{palette}} - 1) + 1 ]; if ($opt{spark}) { - print color($opt{palette}->[ $rel * $#{$opt{palette}} ]) if $opt{palette}; - print $opt{spark}->[ $rel * $#{$opt{spark}} ]; + say '' if $opt{width} and $nr and $nr % $opt{width} == 0; + print color($color), $opt{spark}->[ + !$val ? 0 : # blank + $val == $order[0] ? -1 : # max + $val == $order[-1] ? 1 : # min + $#{$opt{spark}} < 3 ? 1 : + $rel * ($#{$opt{spark}} - 3) + 2.5 + ]; next; } if (length $val) { - my $color = !$opt{palette} ? undef : - $val == $order[0] ? $opt{palette}->[-1] : # max - $val == $order[-1] ? $opt{palette}->[0] : # min - $opt{palette}->[ $rel * ($#{$opt{palette}} - 1) + 1 ]; $val = $opt{units} ? sival($val) : sprintf "%*s", $lenval, $val; color($color) for $val; } @@ -267,12 +277,13 @@ sub show_stat { if ($opt{hidemin} or $opt{hidemax}) { $opt{hidemin} ||= 1; $opt{hidemax} ||= @lines; - printf '%s of ', sum(@values[$opt{hidemin} - 1 .. $opt{hidemax} - 1]) // 0; + printf '%s of ', sum(grep {length} @values[$opt{hidemin} - 1 .. $opt{hidemax} - 1]) // 0; } if (@order) { my $total = sum @order; - printf '%s total', color(1) . $total . color(0); - printf ' in %d values', scalar @values; + printf '%s total', color(1) . sprintf('%.8g', $total) . color(0); + printf ' in %d values', scalar @order; + printf ' over %d lines', scalar @lines if @order != @lines; printf(' (%s min, %s avg, %s max)', color(31) . $order[-1] . color(0), color(36) . (sprintf '%*.*f', 0, 2, $total / @order) . color(0), @@ -300,11 +311,12 @@ barcat - graph to visualize input values =head1 SYNOPSIS -B [] [] +B [] [... | ] =head1 DESCRIPTION -Visualizes relative sizes of values read from input (file(s) or STDIN). +Visualizes relative sizes of values read from input +(parameters, file(s) or STDIN). Contents are concatenated similar to I, but numbers are reformatted and a bar graph is appended to each line. @@ -362,7 +374,7 @@ unless C<--length=0>. Prepend a dash (i.e. make negative) to enforce padding regardless of encountered contents. -=item -L, --limit=(|-[]) +=item -L, --limit[=( | -[])] Stop output after a number of lines. All input is still counted and analyzed for statistics, @@ -526,8 +538,7 @@ USD/EUR exchange rate from CSV provided by the ECB: -Gd 'node=SEARCHRESULTS&q=EXR.D.USD.EUR.SP00.A&exportType=csv' | grep '^[12]' | barcat -f',\K' --value-length=7 -Total population history from the World Bank dataset (XML): -External datasets, like total population in XML from the World Bank: +Total population history in XML from the World Bank: curl http://api.worldbank.org/v2/country/1W/indicator/SP.POP.TOTL | xmllint --xpath '//*[local-name()="date" or local-name()="value"]' - |