tablify1p
Turn a delimited text file into a text table
Usage
tablify [options]
file
Options:
when used
in
conjunction
with
"no-headers"
the list
should
be
field
numbers
(starting
at
1);
where field
"f"
matches
the
value
"v";
acceptable
the number
of
columns
Overview
This script is essentially a quick way to parse a delimited text file and view it as a nice ASCII table. By selecting only certain fields, employing a where clause to only select records where a field matches some value, and using the limit to only see some of the output, you almost have a mini-database front-end for a simple text file.
Examples
Given a data file like this:
name,rank,serial_no,is_living,ageGeorge,General,190293,0,64Dwight,General,908348,0,75Attila,Hun,,0,56Tojo,Emporor,,0,87Tommy,General,998110,1,54
To find the fields you can reference, use the list option:
$ tablify --fs ',' -l people.dat+-----------+-----------+| Field No. | Field |+-----------+-----------+| 1 | name || 2 | rank || 3 | serial_no || 4 | is_living || 5 | age |+-----------+-----------+
To extract just the name and serial numbers, use the fields option:
$ tablify --fs ',' -f name,serial_no people.dat+--------+-----------+| name | serial_no |+--------+-----------+| George | 190293 || Dwight | 908348 || Attila | || Tojo | || Tommy | 998110 |+--------+-----------+5 records returned
To extract the first through third fields and the fifth field (where field numbers start at "1" -- tip: use the list option to quickly determine field numbers), use this syntax for fields:
$ tablify --fs ',' -f 1-3,5 people.dat+--------+---------+-----------+------+| name | rank | serial_no | age |+--------+---------+-----------+------+| George | General | 190293 | 64 || Dwight | General | 908348 | 75 || Attila | Hun | | 56 || Tojo | Emporor | | 87 || Tommy | General | 998110 | 54 |+--------+---------+-----------+------+5 records returned
To select only the ones with six serial numbers, use a where clause:
$ tablify --fs ',' -w 'serial_no=~/^\d{6}$/' people.dat+--------+---------+-----------+-----------+------+| name | rank | serial_no | is_living | age |+--------+---------+-----------+-----------+------+| George | General | 190293 | 0 | 64 || Dwight | General | 908348 | 0 | 75 || Tommy | General | 998110 | 1 | 54 |+--------+---------+-----------+-----------+------+3 records returned
To find Dwight's record, you would do this:
$ tablify --fs ',' -w 'name eq "Dwight"' people.dat+--------+---------+-----------+-----------+------+| name | rank | serial_no | is_living | age |+--------+---------+-----------+-----------+------+| Dwight | General | 908348 | 0 | 75 |+--------+---------+-----------+-----------+------+1 record returned
To find the name of all the people with a serial number who are living:
$ tablify --fs ',' -f name -w 'is_living==1' -w 'serial_no>0' people.dat+-------+| name |+-------+| Tommy |+-------+1 record returned
To filter outside of program and simply format the results, use "-" as the last argument to force reading of STDIN (and probably assume no headers):
$ grep General people.dat | tablify --fs ',' -f 1-3 --no-headers -+---------+--------+--------+| Field1 | Field2 | Field3 |+---------+--------+--------+| General | 190293 | 0 || General | 908348 | 0 || General | 998110 | 1 |+---------+--------+--------+3 records returned
When dealing with data lacking field names, you can specify "no-headers" and then refer to fields by number (starting at one), e.g.:
$ tail -5 people.dat | tablify --fs ',' --no-headers -w '3 eq "General"' -+--------+---------+--------+--------+--------+| Field1 | Field2 | Field3 | Field4 | Field5 |+--------+---------+--------+--------+--------+| George | General | 190293 | 0 | 64 || Dwight | General | 908348 | 0 | 75 || Tommy | General | 998110 | 1 | 54 |+--------+---------+--------+--------+--------+3 records returned
If your file has many fields which are hard to see across the screen, consider using the vertical display with "-v" or "--vertical", e.g.:
$ tablify --fs ',' -v --limit 1 people.dat************ Record 1 ************name: Georgerank: Generalserial_no: 190293is_living: 0age : 641 record returned
License and copyright
Copyright (C) 2006-10 Ken Youens-Clark. All rights reserved.
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
Releases
8 releases since Debian 6.0 (Squeeze); the text changed 4 times.