I am trying to argument processing on awk. It works fine if I have no body in it:
PK@rhel8:~/tmp-> cat testARG.awk
#!/usr/bin/awk -f
BEGIN{
argc = ARGC ;
CmdName = ARGV[0] ;
FirstArg = ARGV[1]
printf("Argument count = %d; command name = %s; first argument = %s\n",argc,CmdName,FirstArg) ;
}
#{
# printf("Argument count = %d; command name = %s; first argument = %s\n",argc,CmdName,FirstArg) ;
# print $0
#}
PK@rhel8:~/tmp-> ./testARG.awk 1 2 3 4
Argument count = 5; command name = awk; first argument = 1
PK@rhel8:~/tmp->
However when I uncomment the body it doesn’t like it at all:
PK@rhel8:~/tmp-> cat testARG.awk
#!/usr/bin/awk -f
BEGIN{
argc = ARGC ;
CmdName = ARGV[0] ;
FirstArg = ARGV[1]
printf("Argument count = %d; command name = %s; first argument = %s\n",argc,CmdName,FirstArg) ;
}
{
printf("Argument count = %d; command name = %s; first argument = %s\n",argc,CmdName,FirstArg) ;
print $0
}
PK@rhel8:~/tmp-> ./testARG.awk 1 2 3 4
Argument count = 5; command name = awk; first argument = 1
awk: ./testARG.awk:6: fatal: cannot open file `1' for reading (No such file or directory)
PK@rhel8:~/tmp->
Is there some different way I have to use awk to allow it to see the arguments as arguments and not files?
>Solution :
You may want to get used to a more standard way of passing non-file args to awk
. A common method is to define awk
variable assignments on the command line. The general format:
awk -v awk_var1="OS val 1" -v awk_var2="OS val 2" '... awk script ...' [ optional list of filenames]
# or
./script.awk -v awk_var1="OS val 1" -v awk_var2="OS val 2" [ optional list of filenames]
If you won’t be processing any files then all processing within the awk
script will need to take place within the BEGIN{}
block.
Since the current script is looking to count input args and print the ‘first’, I take it to mean the number of input args could be variable. One common approach would be to provide the args in a single delimited string, eg:
$ cat testARG.awk
#!/usr/bin/awk -f
BEGIN { n=split(inlist,vars,";") # split awk input variable "inlist" on a ";" delimiter and put results in the vars[] array
CmdName = ARGV[0]
printf "Argument count = %d; command name = %s; first argument = %s\n", n, CmdName, vars[1]
}
$ ./testARG.awk -v inlist="1;2;3;4" # define awk variable "inlist" as a ";"-delimited list of values
Argument count = 4; command name = awk; first argument = 1