value-length option to override $lenval
[barcat.git] / graph
diff --git a/graph b/graph
index d7c2834a20e24fb094a3d0f21546f632067e0336..ea17d4538eafe629e45323dae754ca4d3cea40e7 100755 (executable)
--- a/graph
+++ b/graph
@@ -17,7 +17,7 @@ my %opt;
 GetOptions(\%opt,
        'color|c!',
        'C' => sub { $opt{color} = 0 },
 GetOptions(\%opt,
        'color|c!',
        'C' => sub { $opt{color} = 0 },
-       'field|f=i',
+       'field|f=s',
        'interval|t:i',
        'trim|length|l=s' => sub {
                my ($optname, $optval) = @_;
        'interval|t:i',
        'trim|length|l=s' => sub {
                my ($optname, $optval) = @_;
@@ -28,6 +28,7 @@ GetOptions(\%opt,
                );
                $opt{trim} = $optval;
        },
                );
                $opt{trim} = $optval;
        },
+       'value-length=i',
        'markers|m=s',
        'unmodified|u!',
        'width|w=i',
        'markers|m=s',
        'unmodified|u!',
        'width|w=i',
@@ -51,7 +52,9 @@ if (defined $opt{interval}) {
 $SIG{INT} = 'IGNORE';  # continue after assumed eof
 
 my (@lines, @values);
 $SIG{INT} = 'IGNORE';  # continue after assumed eof
 
 my (@lines, @values);
-my $anchor = $opt{field} ? qr/(?:\S*\h+){$opt{field}}\K/ : qr/^/;
+my $anchor = !defined $opt{field} ? qr/\A/ :
+       $opt{field} =~ /^[0-9]+$/ ? qr/(?:\S*\h+){$opt{field}}\K/ :
+       $opt{field};
 while (readline) {
        s/\r?\n\z//;
        s/^\h*// unless $opt{unmodified};
 while (readline) {
        s/\r?\n\z//;
        s/^\h*// unless $opt{unmodified};
@@ -78,7 +81,7 @@ state $nr = 0;
 my @order  = sort { $b <=> $a } grep { length } @values;
 my $maxval = $order[0];
 my $minval = min $order[-1], 0;
 my @order  = sort { $b <=> $a } grep { length } @values;
 my $maxval = $order[0];
 my $minval = min $order[-1], 0;
-my $lenval = max map { length } @order;
+my $lenval = $opt{'value-length'} // max map { length } @order;
 my $len    = defined $opt{trim} && $opt{trim} <= 0 ? -$opt{trim} + 1 :
        max map { length $values[$_] && length $lines[$_] } 0 .. $#lines;  # left padding
 my $size   = ($maxval - $minval) &&
 my $len    = defined $opt{trim} && $opt{trim} <= 0 ? -$opt{trim} + 1 :
        max map { length $values[$_] && length $lines[$_] } 0 .. $#lines;  # left padding
 my $size   = ($maxval - $minval) &&
@@ -154,11 +157,17 @@ Force colored output of values and bar markers.
 Defaults on if output is a tty,
 disabled otherwise such as when piped or redirected.
 
 Defaults on if output is a tty,
 disabled otherwise such as when piped or redirected.
 
-=item -f, --field=<number>
+=item -f, --field=(<number>|<regexp>)
+
+Compare values after a given number of whitespace separators,
+or matching a regular expression.
 
 
-Compare values after a given number of whitespace separators.
 Unspecified or I<-f0> means values are at the start of each line.
 With I<-f1> the second word is taken instead.
 Unspecified or I<-f0> means values are at the start of each line.
 With I<-f1> the second word is taken instead.
+A string can indicate the starting position of a value
+(such as I<-f:> if preceded by colons),
+or capture the numbers itself,
+for example I<-f'(\d+)'> for the first digits anywhere.
 
 =item -t, --interval[=<seconds>]
 
 
 =item -t, --interval[=<seconds>]
 
@@ -212,6 +221,10 @@ or 68% of all entries.
 Do not strip leading whitespace.
 Keep original value alignment, which may be significant in some programs.
 
 Do not strip leading whitespace.
 Keep original value alignment, which may be significant in some programs.
 
+=item --value-length=<size>
+
+Reserved space for numbers.
+
 =item -w, --width=<columns>
 
 Override the maximum number of columns to use.
 =item -w, --width=<columns>
 
 Override the maximum number of columns to use.
@@ -252,7 +265,7 @@ Exchange rate USD/EUR history from CSV download provided by ECB:
 
     curl https://sdw.ecb.europa.eu/export.do \
          -Gd 'node=SEARCHRESULTS&q=EXR.D.USD.EUR.SP00.A&exportType=csv' |
 
     curl https://sdw.ecb.europa.eu/export.do \
          -Gd 'node=SEARCHRESULTS&q=EXR.D.USD.EUR.SP00.A&exportType=csv' |
-    awk -F, '{RS="\r\n"} /^[12]/{print $1,$2}' | graph -f1
+    grep '^[12]' | graph -f',\K' --value-length=7
 
 Total population history from the World Bank dataset (XML):
 
 
 Total population history from the World Bank dataset (XML):
 
@@ -280,8 +293,7 @@ Or the most frequent authors:
 
 Latency history:
 
 
 Latency history:
 
-    ping google.com |
-    perl -pe '$|=1; print s/ time=(.*)// ? "$1 for " : "> "' | graph -t
+    ping google.com | graph -f'time=\K' -t
 
 =head1 AUTHOR
 
 
 =head1 AUTHOR