jawk -- like awk, but post-modern and perly. AKA, Josh's Awk.
jawk [-x] [-e 'code'] [-d delim] fieldspec [fieldspec...] [-- (FILES..)]:
If you haven't seen awk, then jawk can be described as a flexible tool for extracting columns of data from text files.
If you've seen 'awk', then we can describe jawk as a replacement for statements like
awk '{print $N}'
which supports ranges, indexing columns by negative numbers, a perl mode, and more.
jawk 1 is somewhat like awk '{print $1}'. Let's start with a fairly complex example. Suppose you have a file called 'users.txt' with lines of data in this format:
Bob Elmer, 2716 Fremont Blvd, New York, NY, 12344, ID:91818, CanastaRating:3.1415 Elmer Fudd, 1 Bunny Hill Drive, Tarrytown, NY, 87654, ID:1, CanastaRating:123456789
This statement would pull out the 1st, and 3rd through last columns, using ', ' as an input delimiter (we've put two spaces between options, for clarity):
jawk -d', ' 1 3..-1 -- users.txt
Note the use of negative indexes, the non-default element delimiter via -d, and the -- anti-option (which indicates that following arguments should be considered files to read).
-d
--
jawk also allows ranges using the .. sequence. For example, a field specification can look like A, A..B, A.., or ..B, where (A and B can be negative or positive integers.
..
A
A..B
A..
..B
B
Negative values for A and B count backwards, so -1 is the last field.
Use -- or - FILENAME.txt to read from files. '--' is needed to treat FILENAME.txt as file and not fieldspec. See examples below.
Where you might previously use a command like
grep pattern file.txt | awk '{print $2}'
to pull out the 2nd column from a file, you can now do:
grep pattern file.txt | jawk 2
jawk offers many other improvements. Here are examples:
select out the 1st, 3rd, and 4th columns from file
cat file | jawk 1 3 4
select all columns except the 1st, and 9th through remaining. Uses the -x option for an 'except' meaning.
cat file | jawk -x 1 9..-1
select out the first through third, and the second to last, and last cols from a file.
cat file | jawk 1..3 -2 -1
Same as above, but using : as an input delimiter instead of whitespace. Note use of -- to start list of files to read from @ARGV, so we can pass file to jawk directly instead of through cat.
file
cat
jawk -d: 1..3 -2 -1 -- file
There is also a -exe='perlcode' mode where you access the args via @F, and not via named positional args. Like so:
cat file | jawk -e 'print "@F\n";'
Here's an explation of all the command-line options:
NON-ZERO INTEGER
A field specification option indicating that this particular column should (or should not, depending on -x, be output).
Negative indexes count from the right, like in perl, so the right-most column is number -1.
-1
RANGE OF NON-ZERO INTEGERS
Integer ranges are specified with .., and given that A and B are non-zero integers, can look like
A..B A.. ..B
If you specify ranges in reverse order from their source, like cat file | jawk -1..1 or cat file | jawk 8-2 you'll get the fields in reverse order, like you asked.
cat file | jawk -1..1
cat file | jawk 8-2
Specify an alternate delimiter in place of '\s+'. If not ' ', the delimiter is processed through perl's quotemeta() function and used as a regular expression to match between input fields.
Specify an alternate join character sequence in place of 'space'.
Exclude the chosen columns, negating their meaning. Does not interoperate with -e 'perlcode' option.
Use perl code passed to process parsed items. Fields come in through the @F array, and are 0-indexed (like in perl) instead of 1-indexed (like in jawk and cut). A simple example, which shows the first and second columns of input, is
cat file.txt | jawk -e 'print "$F[0] $F[1]\n"'
Run perl code used with -e option with warnings on. (Strictness is always enabled but can be disabled by putting 'no strict' in your script).
Show version number of jawk and exit.
Ends argument parsing. Used to pass filenames to read from stdin. See examples above.
None known
Copyright (c) 2011-2012 Josh Rabinowitz, All Rights Reserved.
Josh Rabinowitz
To install App::Jawk, copy and paste the appropriate command in to your terminal.
cpanm
cpanm App::Jawk
CPAN shell
perl -MCPAN -e shell install App::Jawk
For more information on module installation, please visit the detailed CPAN module installation guide.