NetBSD-Docs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

awk FS magic



The -F option for awk is more clever than the manual says.  Do we want
the behavior, or is the manual right?  

I noticed a working bug in a little script that led to this suprising
result:

        $ echo foo | awk -F t '{print FS}' | hexdump -C
        00000000  09 0a                                             |..|
        00000002

If the argument to the -F option is

        t

awk assumes you meant '\t' and sets the FS variable to TAB.  That's not
mentioned in the manual.  Apparently the only way to use the letter 't'
as a field separator is with the regex '[t]'.

I'm sure that's meant to help the clueless, because I found myself
taking advantage of it in my own script

        |  grep -f /etc/whitelist.dat   \
        |  awk -F\t '{print $2}'  \
        |  sed s'/[<>]//g'  \

even though I had no right to expect it to work.  

This appears to be the only specially treated character.  The relevant
function is setfs().  It has a pithy comment inside conditional
compilation:

static char *
setfs(char *p)
{
#ifdef notdef
        /* wart: t=>\t */
        if (p[0] == 't' && p[1] == 0)
                return "\t";
        else
#endif
        if (p[0] != 0)
                return p;
        return NULL;
}

I find no support for this "wart" at the open group
(http://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html).
Maybe we should just change the Makefile?  

--jkl




Home | Main Index | Thread Index | Old Index