=head1 NAME
recs-stream2table
=head1 recs-stream2table --help-all
Help from: --help-basic:
Usage: recs-stream2table <args> [<files>]
Transforms a list of records, combinging records based on a column, FIELD. In
order, the
values
of the column will be added to the output records.
Note: This script spools the stream into memory
This stream:
{
"column"
:
"foo"
,
"data"
:
"foo1"
}
{
"column"
:
"foo"
,
"data"
:
"foo2"
}
{
"column"
:
"boo"
,
"data"
:
"boo1"
}
{
"column"
:
"boo"
,
"data"
:
"boo2"
}
with
recs-stream2table --field column becomes:
{
"boo"
:{
"data"
:
"boo1"
},
"foo"
:{
"data"
:
"foo1"
}}
{
"boo"
:{
"data"
:
"boo2"
},
"foo"
:{
"data"
:
"foo2"
}}
Hint:
use
recs-flatten
if
you want those
values
to be in the top level of
the record
The full input record will be associated
with
the value of the FIELD. The
field itself will be removed from the nested record
if
the passed field is
not a key spec.
Arguments:
--field <FIELD> Field to
use
as the column key, may be a keyspec
--filename-key|fk <keyspec> Add a key
with
the source filename (
if
no
filename is applicable will put NONE)
Help Options:
--help-all Output all help
for
this script
--help This help screen
--help-keyspecs Help on keyspecs, a way to
index
deeply and
with
regexes
Examples:
... | recs-stream2table --field
stat
Help from: --help-keyspecs:
KEY SPECS
A key spec is short way of specifying a field
with
prefixes or regular
expressions, it may also be nested into hashes and arrays. Use a
'/'
to nest
into a hash and a
'#NUM'
to
index
into an array (i.e. #2)
An example is in order, take a record like this:
{
"biz"
:[
"a"
,
"b"
,
"c"
],
"foo"
:{
"bar 1"
:1},
"zap"
:
"blah1"
}
{
"biz"
:[
"a"
,
"b"
,
"c"
],
"foo"
:{
"bar 1"
:2},
"zap"
:
"blah2"
}
{
"biz"
:[
"a"
,
"b"
,
"c"
],
"foo"
:{
"bar 1"
:3},
"zap"
:
"blah3"
}
In this case a key spec of
'foo/bar 1'
would have the
values
1,2, and 3 in
the respective records.
Similarly,
'biz/#0'
would have the value of
'a'
for
all 3 records
You can also prefix key specs
with
'@'
to engage the fuzzy matching logic
Fuzzy matching works like this in order, first key to match wins
1. Exact match ( eq )
2. Prefix match ( m/^/ )
3. Match anywehre in the key (m//)
So, in the above example
'@b/#2'
, the
'b'
portion would expand to
'biz'
and 2
would be the
index
into the array, so all records would have the value of
'c'
Simiarly,
@f
/b would have
values
1, 2, and 3
You can escape /
with
a \. For example,
if
you have a record:
{
"foo/bar"
:2}
You can address that key
with
foo\/bar
=head1 See Also
=over
=item L<RecordStream(3)> - Overview of the scripts and the
system
=item L<recs-examples(3)> - A set of simple recs examples
=item L<recs-story(3)> - A humorous introduction to RecordStream
=item SCRIPT --help - every script
has
a --help option, like the output above
=back