App-RecordStream
view release on metacpan or search on metacpan
lib/App/RecordStream/Operation/toptable.pm view on Meta::CPAN
\$ cat /var/tmp/psrecs | recs-collate --perfect --key priority,state -a count --cube -a sum,rss | recs-toptable --x priority --y state
+-----+--------+-------+-------+--------+
| |priority|0 |19 |ALL |
+-----+--------+-------+-------+--------+
|state| | | | |
+-----+--------+-------+-------+--------+
|ALL | |5255168|8757248|14012416|
+-----+--------+-------+-------+--------+
|run | |4784128|8757248|13541376|
+-----+--------+-------+-------+--------+
|sleep| |471040 |0 |471040 |
+-----+--------+-------+-------+--------+
__FORMAT_TEXT__
We now have sum_rss values in this field. What if we want the other field
(count) displayed? We just use --v-field to specify what value field to
use:
__FORMAT_TEXT__
\$ cat /var/tmp/psrecs | recs-collate --perfect --key priority,state -a count --cube -a sum,rss | recs-toptable --x priority --y state --v count
+-----+--------+-+--+---+
| |priority|0|19|ALL|
+-----+--------+-+--+---+
|state| | | | |
+-----+--------+-+--+---+
|ALL | |5|3 |8 |
+-----+--------+-+--+---+
|run | |1|2 |3 |
+-----+--------+-+--+---+
|sleep| |4|1 |5 |
+-----+--------+-+--+---+
__FORMAT_TEXT__
Ok, but what if we want to see both left over fields at the same time? What we
really want is to add a column or row for each of count and sum_rss. (where
the title of the row is count or sum_rss, not the values of the field). We can
do this by using the special FIELD specifier like so:
__FORMAT_TEXT__
\$ cat /var/tmp/psrecs | recs-collate --perfect --key priority,state -a count --cube -a sum,rss | recs-toptable --x priority,FIELD --y state
+-----+--------+-----+-------+-----+-------+-----+--------+
| |priority|0 | |19 | |ALL | |
+-----+--------+-----+-------+-----+-------+-----+--------+
| |FIELD |count|sum_rss|count|sum_rss|count|sum_rss |
+-----+--------+-----+-------+-----+-------+-----+--------+
|state| | | | | | | |
+-----+--------+-----+-------+-----+-------+-----+--------+
|ALL | |5 |5255168|3 |8757248|8 |14012416|
+-----+--------+-----+-------+-----+-------+-----+--------+
|run | |1 |4784128|2 |8757248|3 |13541376|
+-----+--------+-----+-------+-----+-------+-----+--------+
|sleep| |4 |471040 |1 |0 |5 |471040 |
+-----+--------+-----+-------+-----+-------+-----+--------+
__FORMAT_TEXT__
So, now in one table we can see all the intersections of state and priority
values with the count and sum_rss fields. Remember that the ALL field (row and
column) are provided by the --cube functionality of recs-collate
Now, say you want to pin value, lets just look at processes in state run for
instance:
__FORMAT_TEXT__
\$ cat /var/tmp/psrecs | recs-collate --perfect --cube --key priority,state -a count -a sum,rss | recs-toptable --x priority,FIELD --y state -v sum_rss,count --pin state=run
+-----+--------+-----+-------+-----+-------+-----+--------+
| |priority|0 | |19 | |ALL | |
+-----+--------+-----+-------+-----+-------+-----+--------+
| |FIELD |count|sum_rss|count|sum_rss|count|sum_rss |
+-----+--------+-----+-------+-----+-------+-----+--------+
|state| | | | | | | |
+-----+--------+-----+-------+-----+-------+-----+--------+
|run | |1 |4784128|2 |8757248|3 |13541376|
+-----+--------+-----+-------+-----+-------+-----+--------+
__FORMAT_TEXT__
As you can see, this is basically short hand for doing a recs-grep, the transformation to recs group would look like:
__FORMAT_TEXT__
\$ cat /var/tmp/psrecs | recs-collate --perfect --cube --key priority,state -a count -a sum,rss | recs-grep '\$r->{state} eq "run"' | recs-toptable --x priority,FIELD --y state -v sum_rss,count
__FORMAT_TEXT__
(which produces the same table as above).
__FORMAT_TEXT__
FULL_EXAMPLES
}
sub usage {
my $this = shift;
my $options = [
['x-field|x', 'Add a x field, values of the specified field will become columns in the table, may be a keyspec or a keygroup'],
['y-field|y', 'Add a y field, values of the specified field will become rows in the table, may be a keyspec or a keygroup'],
['v-field|v', 'Specify the value to display in the table, if multiple value fields are specified and FIELD is not placed in the x or y axes, then the last one wins, may be a keyspec or a keygroup. If FIELD is in an axis, then --v specifies the f...
['pin', 'Pin a field to a certain value, only display records matching that value, very similar to doing a recs-grep before toptable. Takes value of the form: field=pinnedValue, field may be a keyspec (not a keygroup)'],
['sort', 'Take sort specifications to sort X values and Y values in headers. See `recs-sort --help` for details of sort specifications, especially the * option to sort "ALL" to the end, e.g. "some_field=lex*".'],
['noheaders', 'Do not print row and column headers (removes blank rows and columns)'],
['records|recs', 'Instead of printing table, output records, one per row of the table.'],
['sort-to-end|sa', 'Sort ALL fields to the end, equivalent to --sort FIELD=* for each --y and --y field'],
];
my $args_string = $this->options_string($options);
return <<USAGE;
Usage: recs-toptable <args> [<files>]
__FORMAT_TEXT__
Creates a multi-dimensional pivot table with any number of x and y axises.
There is additional help available through --full that includes examples
The x and y rows and columns are the values of the field specified
X and Y fields can take the special value 'FIELD' which uses unused field
names as values for the FIELD dimension
__FORMAT_TEXT__
$args_string
Simple Examples (see --full for more detailed descriptions)
# Collate and display in a nice table
... | recs-collate --key state,priority -a count | recs-toptable --x state --y priority
( run in 1.555 second using v1.01-cache-2.11-cpan-d7a12ab2c7f )