I have an awk script that I have defined thus:
#!/usr/bin/env awk
BEGIN { if (!len) len = 1; end = start + len }
{ for (i = start; i < end; i++) { print $1 } }
I have saved it as columns
and chmod +x
'd it. I want invoke it so that start
and end
are defined as it traverses over a file. I was thinking this should work:
cat some_file | columns -v start=2
But it doesn't. Help!
Below is the answer for this problem -
env is the easiest way to handle this problem:
to add more options, and to ensure no interference with your arguments, and awk's arguments:
as env has a POSIX standard, this shbang should get you around the difficulties of non-standard shbang implementations across unixen.
EDIT
after having written this I realized that '-S' is a non-POSIX compliant FreeBSD env extension. So shell wrapper is probably the way to go, unfortunate as that is.
Try using:
as an interpreter
Unfortunately, this is not easy to solve in a portable way. The standard technique looks like this (substitute
/usr/bin/awk
for your awk path):The hard-coded
awk
path and non-standard-f
flag, makes this not portable across all *nixes. If you are only ever going to run your script on one machine, then this may work fine. However, to make a portableawk
script, you will need to wrap it in a shell script. Here are two ways that you can do it in one file:The first way is standard and easy to read:
Unfortunately, this falls short in two key ways:
'
character, you will need to type it like this:'"'"'
to "escape" it.Another solution, is to use
sed
to strip out thesh
wrapper:This is something like a two line shabang header. It calls awk using the file from line 3 down as the script argument. This allows you to keep your pretty syntax highlighting and you can still use
'
characters to your heart's content. The two downsides I see are: