Pass parameter to an awk script file

前端 未结 3 1479
走了就别回头了
走了就别回头了 2021-02-01 15:23

If I want to pass a parameter to an awk script file, how can I do that ?

#!/usr/bin/awk -f

{print $1}

Here I want to print the first argument

3条回答
  •  [愿得一人]
    2021-02-01 15:59

    your hash bang defines the script is not shell script, it is an awk script. you cannot do it in bash way within your script.

    also, what you did : echo blah|awk ... is not passing paramenter, it pipes the output of echo command to another command.

    you could try these way below:

     echo "hello"|./foo.awk file -
    

    or

    var="hello"
    awk -v a="$var" -f foo.awk file
    

    with this, you have var a in your foo.awk, you could use it.

    if you want to do something like shell script accept $1 $2 vars, you can write a small shellscript to wrap your awk stuff.

    EDIT

    No I didn't misunderstand you.

    let's take the example:

    let's say, your x.awk has:

    {print $1}
    

    if you do :

    echo "foo" | x.awk file
    

    it is same as:

    echo "foo"| awk '{print $1}' file
    

    here the input for awk is only file, your echo foo doesn't make sense. if you do:

      echo "foo"|awk '{print $1}' file -
    or
        echo "foo"|awk '{print $1}' - file
    

    awk takes two input (arguments for awk) one is stdin one is the file, in your awk script you could:

    echo "foo"|awk 'NR==FNR{print $1;next}{print $1}' - file
    

    this will print first foo from your echo, then the column1 from file of course this example does nothing actual work, just print them all.

    you can of course have more than two inputs, and don't check the NR and FNR, you could use the

    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
    

    for example :

    echo "foo"|./x.awk file1 - file2
    

    then your "foo" is the 2nd arg, you can get it in your x.awk by ARGV[2]

    echo "foo" |x.awk file1 file2 file2 -
    

    now it is ARGV[4] case.

    I mean, your echo "foo"|.. would be stdin for awk, it could by 1st or nth "argument"/input for awk. depends on where you put the -(stdin). You have to handle it in your awk script.

提交回复
热议问题