WomenWhoCode
WomenWhoCode

Reputation: 426

awk illegal statement at source line 1

I am executing following awk command:

awk -F'\t' '{ split($4,array,"[- ]"); print > array[1]""array[2]""array[3]}' myFile.txt

but seeing this error:

awk: syntax error at source line 1
 context is
    { split($4,array,"[- ]"); print > >>>  array[1]"" <<<
awk: illegal statement at source line 1
awk: illegal statement at source line 1

What can be the reason for that? How to fix the script?

Upvotes: 0

Views: 933

Answers (3)

RARE Kpop Manifesto
RARE Kpop Manifesto

Reputation: 2865

here's an awk-based solution verified on 4 awk variants, requires no array splitting, while also closing file connections along the way :

  • pristine $0 has been pre-saved, thus performing ++NF against a blank OFS does not result in data truncation

    (ps : as a matter of fact, saving $0 is 
          only necessary for gawk and nawk )
    

SETUP and INPUT

removed 'wyx-8979479BCCF-;@%&*[)(]~'

zsh: no matches found: wyx*

     1   --------INPUT------------

     2  bca 0106    qsr wyx-8979479BCCF-=;@%&*[)(]~ testtail

CODE

{m,n,g}awk '
BEGIN {
       OFS = _
        FS = "^[^\t]*\t[^\t]*\t[^\t]*\t|[ -]|\t[^\t]*$"
}    {
       ___ = $(_*(__==_?_:close(__)))
 print(___) > (__ = $!++NF)           }'


# mawk-1/2 specific streamlining 

mawk 'BEGIN { FS="^[^\t]*\t[^\t]*\t[^\t]*\t|[ -]|\t[^\t]*$"(OFS=_)
          } { print $(_*(__==_?_:close(__))) > (__ = $!++NF)     }'

OUTPUT

-rw-r--r--  1 501  20  50 Jun 19 12:13 wyx8979479BCCF=;@%&*[)(]~

     1  bca 0106    qsr wyx-8979479BCCF-=;@%&*[)(]~ testtail

Upvotes: 0

Ed Morton
Ed Morton

Reputation: 203995

Those pairs of double quotes are doing nothing, you could just remove them:

awk -F'\t' '{ split($4,array,"[- ]"); print > array[1] array[2] array[3]}' myFile.txt

An unparenthesized expression on the right side of input or output redirection is undefined behavior per POSIX which is why some awks (e.g. gawk) will interpret your code as you intended:

awk -F'\t' '{ split($4,array,"[- ]"); print > (array[1] array[2] array[3])}' myFile.txt

while others can interpret it as:

awk -F'\t' '{ split($4,array,"[- ]"); (print > array[1]) (array[2] array[3])}' myFile.txt

which is a syntax error in any awk, or anything else.

You can fix your syntax error by adding the parens:

awk -F'\t' '{ split($4,array,"[- ]"); print > (array[1] array[2] array[3])}' myFile.txt

but that could have other problems too and the right way to do what you're trying to do depends on whatever it is you're trying to do, which we can't tell just from your code. If you post a new question with sample input and expected output then we can help you write your code the right way.

Upvotes: 1

Shawn
Shawn

Reputation: 52529

You need

print > (array[1]""array[2]""array[3])

in many implementations of awk. Note the parenthesis around the expression that generates the filename.

Might want to close the file afterwards too in case there's a lot of possible filenames that can be created, and use appending instead:

awk -F'\t' '{ split($4,array,"[- ]")
              file = array[1] "" array[2] "" array[3]
              print >> file
              close(file)
             }' myFile.txt

Upvotes: 1

Related Questions