prefix + to select numeric fields in -f
authorMischa POSLAWSKY <perl@shiar.org>
Mon, 14 Nov 2022 23:19:41 +0000 (00:19 +0100)
committerMischa POSLAWSKY <perl@shiar.org>
Mon, 21 Nov 2022 15:24:42 +0000 (16:24 +0100)
Possible using regular expressions, but needlessly complex for such a common
use or desire.

barcat
t/t0002-usage_-h_|wc_-l.out
t/t1305-numeric_field.in [new file with mode: 0644]
t/t1305-numeric_field_-f+1.out [new file with mode: 0644]

diff --git a/barcat b/barcat
index c0292257676ade42c1a2b5c7a9d429d092bd92f7..5181143fe9bdd92d1544dc49b69f07e52ddaa754 100755 (executable)
--- a/barcat
+++ b/barcat
@@ -19,7 +19,9 @@ GetOptions(\%opt,
        'field|f=s' => sub {
                eval {
                        local $_ = $_[1];
-                       $opt{anchor} = /\A[0-9]+\z/ ? qr/(?:\S*\h+){$_}\K/ : qr/$_/;
+                       s/\A[0-9]+\z/(?:\\S*\\h+){$_}\\K/;
+                       s/\A[+]([0-9]*)\z/(?:\\d+\\D+\\b){$1}\\K \\s* (?=\\d)/;
+                       $opt{anchor} = qr/$_/;
                } or die $@ =~ s/(?:\ at\ \N+)?\Z/ for option $_[0]/r;
        },
        'human-readable|H!',
@@ -370,7 +372,8 @@ Usage:                                               /\_/\
 Options:
   -a, --[no-]ascii         Restrict user interface to ASCII characters
   -C, --[no-]color         Force colored output of values and bar markers
-  -f, --field=(N|REGEXP)   Compare values after a given number of whitespace
+  -f, --field=([+]N|REGEXP)
+                           Compare values after a given number of whitespace
                            separators
       --header             Prepend a chart axis with minimum and maximum
                            values labeled
@@ -438,7 +441,7 @@ disabled otherwise such as when piped or redirected.
 Can also be disabled by setting I<-M>
 or the I<NO_COLOR> environment variable.
 
-=item -f, --field=(<number> | <regexp>)
+=item -f, --field=([+]<number> | <regexp>)
 
 Compare values after a given number of whitespace separators,
 or matching a regular expression.
@@ -449,6 +452,7 @@ 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.
+A shorthand for this is I<+0>, or I<+N> to find the Nth number.
 
 =item --header
 
@@ -599,6 +603,10 @@ Compare file sizes (with human-readable numbers):
 
     du -d0 -b * | barcat -H
 
+Same from formatted results, selecting the first numeric value:
+
+    tree -s --noreport | barcat -H -f+0
+
 Memory usage of user processes with long names truncated:
 
     ps xo rss,pid,cmd | barcat -l40
@@ -657,6 +665,11 @@ Total population history in XML from the World Bank:
     xmlstarlet sel -t -m '*/*' -v wb:date -o ' ' -v wb:value -n |
     barcat -f1 -H
 
+Population and other information for all countries:
+
+    curl http://download.geonames.org/export/dump/countryInfo.txt |
+    grep -v '^#\s' | column -tns$'\t' | barcat -f+2 -u -l150 -s
+
 And of course various Git statistics, such commit count by year:
 
     git log --pretty=%ci | cut -b-4 | uniq -c | barcat
index bb95160cb6e07358f54a28a208ae41e69889c97b..a7873645902455c63d166fdcaa4b2fe565f6de7d 100644 (file)
@@ -1 +1 @@
-33
+34
diff --git a/t/t1305-numeric_field.in b/t/t1305-numeric_field.in
new file mode 100644 (file)
index 0000000..3e83ee9
--- /dev/null
@@ -0,0 +1,8 @@
+1
+numeric 1 2 3
+         -1      -2-3
+ more numeric 1 with text 2 3
+
+0 0 0 0 0
+non-numeric text column
+111 2e0...
diff --git a/t/t1305-numeric_field_-f+1.out b/t/t1305-numeric_field_-f+1.out
new file mode 100644 (file)
index 0000000..10d10df
--- /dev/null
@@ -0,0 +1,8 @@
+1
+numeric 1   2 3                ------=-+
+-1      -  2-3                 ------=-+
+more numeric 1 with text   2 3 ------=-+
+
+0   0 0 0 0                    
+non-numeric text column
+111 2e0...                     ------=-+