possible awk bug
carl
carl at bdaemon.UUCP
Sat Apr 13 13:19:24 AEST 1985
I apologize for not answering the following by mail, but have managed to
loose the original message (we have but a 40 Mbyte disk on our Pixel 100/AP
and news articles are expired after seven days). Anyway
{harvard,seismo,ut-sally,ihnp4!packard}!topaz!jaffe writes:
> It seems to me that the line:
>
> echo "This is a test" | awk {$1 = "Foo"; print}
>
> should print out "Foo is a test" but all I get when I try it is the
> original line.
>
> Is this a bug in awk?
No, it is not. The shell is the problem. As written, the assignment
$1 = "Foo"
will substitute "This" for $1 and, depending on the version of awk, will
either ignore the assignment or produce an error message because the user
is asking for
This = "Foo"
which is obviously non-sense.
The solution is very simple, namely enclose the awk statements in single
quotes. Thus
echo "This is a test" | awk '{$1 = "Foo"; print}'
will produce the desired result since the single quotes remove the special
meaning of all shell meta-characters and there is no longer a conflict
between the first argument passed to awk and the way fields are referred
to in awk.
If you are using the System V (or System III) shell an easy way to test
this sort of thing from the terminal is to first execute
$ set -x
$ echo ........
not forgetting to do a
$ set +x
after you are done experimenting.
Kernighan & Pike have many examples of how to handle the interaction
between the shell and awk and sed and others, and I strongly recommend
studying that book.
Carl Brandauer
daemon associates, Inc.
1760 Sunset Boulevard
Boulder, CO 80302
303-442-1731
{allegra|amd|attunix|cbosgd|ucbvax|ut-sally}!nbires!bdaemon!carl
More information about the Comp.unix
mailing list