X-Git-Url: http://git.shiar.net/barcat.git/blobdiff_plain/61a444b020fe921791fff78c3acc3f39b5495f5a..77579ec26757b44558536f8877d5d4ef58a05229:/barcat diff --git a/barcat b/barcat index 7289039..da07ea7 100755 --- a/barcat +++ b/barcat @@ -5,7 +5,7 @@ use utf8; use List::Util qw( min max sum ); use open qw( :std :utf8 ); -our $VERSION = '1.06'; +our $VERSION = '1.07'; use Getopt::Long '2.33', qw( :config gnu_getopt ); my %opt; @@ -122,6 +122,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{hidemin} = ($opt{hidemin} || 1) - 1; $opt{input} = @ARGV && $ARGV[0] =~ m/\A[-0-9]/ ? \@ARGV : undef and undef $opt{interval}; @@ -179,12 +180,21 @@ sub color { $_ = color(@_) . $_ . color(0) if defined; } +sub sival { + my $unit = int(log(abs $_[0] || 1) / log(10) - 3*($_[0] < 1) + 1e-15); + my $float = $_[0] !~ /^0*[-0-9]{1,3}$/; + sprintf('%3.*f%1s', + $float && ($unit % 3) == ($unit < 0), # tenths + $_[0] / 1000 ** int($unit/3), # number + $#{$opt{units}} * 1.5 < abs $unit ? "e$unit" : $opt{units}->[$unit/3] + ); +} + sub show_lines { -state $nr = $opt{hidemin} ? $opt{hidemin} - 1 : 0; -@lines and @lines > $nr or return; +state $nr = $opt{hidemin}; @lines or return; -@lines > $nr or return unless $opt{hidemin}; +@lines > $nr or return; @order = sort { $b <=> $a } @order unless tied @order; my $maxval = $opt{maxval} // ( @@ -234,18 +244,6 @@ if ($opt{markers} and $size > 0) { } } -@lines > $nr or return if $opt{hidemin}; - -sub sival { - my $unit = int(log(abs $_[0] || 1) / log(10) - 3*($_[0] < 1) + 1e-15); - my $float = $_[0] !~ /^0*[-0-9]{1,3}$/; - sprintf('%3.*f%1s', - $float && ($unit % 3) == ($unit < 0), # tenths - $_[0] / 1000 ** int($unit/3), # number - $#{$opt{units}} * 1.5 < abs $unit ? "e$unit" : $opt{units}->[$unit/3] - ); -} - say( color(31), sprintf('%*s', $lenval, $minval), color(90), '-', color(36), '+', @@ -294,9 +292,9 @@ say $opt{palette} ? color(0) : '' if $opt{spark}; sub show_stat { if ($opt{hidemin} or $opt{hidemax}) { - $opt{hidemin} ||= 1; - $opt{hidemax} ||= @lines; - printf '%s of ', sum(grep {length} @values[$opt{hidemin} - 1 .. $opt{hidemax} - 1]) // 0; + printf '%s of ', sum(grep { length } + @values[$opt{hidemin} .. ($opt{hidemax} || @lines) - 1] + ) // 0; } if (@order) { my $total = sum @order; @@ -450,6 +448,11 @@ or alternatively I<1;30> for bright black. In case of additional colors, the last is used for values equal to the maximum, the first for minima. If unspecified, these are green and red respectively (I<31 90 32>). +Multiple intermediate colors will be distributed +relative to the size of values. + +Predefined color schemes are named I and I, +or I and I for 256-color variants. =item --spark[=] @@ -533,10 +536,14 @@ Any kind of database query with counts, preserving returned alignment: echo 'SELECT count(*),schemaname FROM pg_tables GROUP BY 2' | psql -t | barcat -u +In PostgreSQL from within the client: + + postgres=> SELECT sin(generate_series(0, 3, .1)) \g |barcat + Earthquakes worldwide magnitude 1+ in the last 24 hours: https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/1.0_day.csv | - column -tns, | graph -f4 -u -l80% + column -tns, | barcat -f4 -u -l80% External datasets, like movies per year: @@ -579,7 +586,7 @@ Activity graph of the last days (substitute date C<-v-{}d> on BSD): ( git log --pretty=%ci --since=30day | cut -b-10 seq 0 30 | xargs -i date +%F -d-{}day ) | - sort | uniq -c | awk '$1--' | graph --spark + sort | uniq -c | awk '$1--' | barcat --spark =head1 AUTHOR