X-Git-Url: http://git.shiar.net/barcat.git/blobdiff_plain/48a2e93f039145d144094a5cd0fdae12ae3cb5fa..77579ec26757b44558536f8877d5d4ef58a05229:/barcat diff --git a/barcat b/barcat index ae9fff1..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; @@ -445,11 +443,16 @@ These options can be set to customize this range. Override colors of parsed numbers. Can be any CSI escape, such as I<90> for default dark grey, -or alternatively I<1;30> for bold black. +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