user10600161
user10600161

Reputation: 13

AWK script command line arguments and file input

#!/usr/bin/awk -f

BEGIN{
    print ARGV[1]
}
{
    print $1, $3
}
END{
    print "Done"
}

I need to have both command-line arguments and file as input. I have tried the following and got the error shown:

cat users.txt |./temp.awk 3
3
awk: ./temp.awk:4: fatal: cannot open file `3' for reading (No such file or directory)

The command-line argument is shown but i cannot seem to find a way to read the file.

Thanks.

Upvotes: 0

Views: 1153

Answers (1)

user13529681
user13529681

Reputation:

In this case, you may set ARGV[1] or ARGC inside the BEGIN block:

BEGIN {
    print ARGV[1]
    # Empty ARGV[1] so that it is not treated as a filename
    ARGV[1]=""
}
{
    print $1, $3
}
END {
    print "Done"
}

man 1p awk:

ARGC The number of elements in the ARGV array.

ARGV An array of command line arguments, excluding options and the program argument, numbered from zero to ARGC−1.

The arguments in ARGV can be modified or added to; ARGC can be altered. As each input file ends, awk shall treat the next non-null element of ARGV, up to the current value of ARGC−1, inclusive, as the name of the next input file. Thus, setting an element of ARGV to null means that it shall not be treated as an input file. The name '' indicates the standard input. If an argument matches the format of an assignment operand, this argument shall be treated as an assignment rather than a file argument.

Upvotes: 2

Related Questions