awk如何区分参数和输入文件?

awk如何区分参数和输入文件?,awk,sh,Awk,Sh,这是我的shell脚本,它从stdin接收一个字符串作为用户的输入 #!bin/sh printf "Enter your query\n" read query cmd=`echo $query | cut -f 1 -d " "` input_file=`echo $query | cut -f 2 -d " "` printf $input_file if [ $input_file = "" ] then printf "No input file specified\n"

这是我的shell脚本,它从stdin接收一个字符串作为用户的输入

#!bin/sh
printf "Enter your query\n"

read query
cmd=`echo $query | cut -f 1 -d " "`
input_file=`echo $query | cut -f 2 -d " "`
printf $input_file

if [ $input_file = "" ]
then
    printf "No input file specified\n"
    exit
fi
if [ $cmd = "summary" ]
then
    awk -f summary.awk $input_file $query
fi
假设他进来了

summary a.txt /o foo.txt
现在
cmd
变量将取值
summary
input\u file
将取
a.txt
。 对不对

我希望summary.awk根据
$query
中的内容处理
$input\u文件

我的理解如下:

  • 传递的第一个命令行参数被视为输入文件。 e、 g.:
    awk“code”文件arg1 arg2 arg3
    只有
    文件
    被视为输入文件

  • 如果输入文件是通过管道传输的,则不会将任何参数视为输入文件。 e、 g.:
    cat文件| awk“code”arg1 arg2 arg3
    arg1
    未被视为输入文件

  • 我说得对吗

    问题是 我得到
    awk:无法打开摘要(没有这样的文件或目录)
    为什么它试图打开
    摘要
    ? 它是
    $input\u file
    之后的下一个单词


    如何解决此问题?

    如果没有
    -f
    选项,第一个非选项参数将被视为脚本,其余参数为输入文件。如果有
    -f
    选项,则脚本来自该文件,其余为输入文件

    当且仅当没有输入文件参数时,它从stdin读取输入。这意味着,如果您将管道连接到awk并为其提供文件名参数,它将忽略管道

    这与大多数Unix文件处理命令相同

    试试这个:

    awk -f summary.awk -v query="$query" "$input_file"
    

    这将把awk变量
    query
    设置为查询的内容。

    如果没有
    -f
    选项,第一个非选项参数将被视为脚本,其余参数为输入文件。如果有
    -f
    选项,则脚本来自该文件,其余为输入文件

    当且仅当没有输入文件参数时,它从stdin读取输入。这意味着,如果您将管道连接到awk并为其提供文件名参数,它将忽略管道

    这与大多数Unix文件处理命令相同

    试试这个:

    awk -f summary.awk -v query="$query" "$input_file"
    

    这将把awk变量
    query
    设置为查询的内容。

    因此,将数据传递给awk脚本的正确方法是使用-v选项?否则,传递的参数必然会被视为要迭代的输入文件?是。我认为您可以在脚本中读取并分配到
    ARGV
    ,以删除输入文件,但这不是执行您所需操作的最佳方式。我尝试在awk脚本中打印
    query
    。它说:
    非法引用变量查询
    。我们必须在
    $query
    或类似的地方使用双引号吗?我的意思是,它仍然在shell脚本文件中,所以,我们必须吗?您需要在shell脚本中使用双引号,但不需要在
    summary.awk
    中使用双引号。在awk文件中有一个名为
    query
    的变量。这就是问题所在。很抱歉但是我刚刚试过:
    awk'BEGIN{print query}'-v query=“$query”“$input\u file”
    awk'BEGIN{print FILENAME}'-v query=“$query”“$input\u file”
    它们都打印空行。所以,将数据传递给awk脚本的正确方法是使用-v选项?否则,传递的参数必然会被视为要迭代的输入文件?是。我认为您可以在脚本中读取并分配到
    ARGV
    ,以删除输入文件,但这不是执行您所需操作的最佳方式。我尝试在awk脚本中打印
    query
    。它说:
    非法引用变量查询
    。我们必须在
    $query
    或类似的地方使用双引号吗?我的意思是,它仍然在shell脚本文件中,所以,我们必须吗?您需要在shell脚本中使用双引号,但不需要在
    summary.awk
    中使用双引号。在awk文件中有一个名为
    query
    的变量。这就是问题所在。很抱歉但我刚刚试过:
    awk'BEGIN{print query}'-v query=“$query”“$input\u file”
    awk'BEGIN{print FILENAME}'-v query=“$query”“$input\u file”
    两者都打印空行,而不是
    读取query
    ,然后用
    cut
    解析
    $query
    ,只需执行:
    read cmd input_file rements
    (确保IFS是一个合理的值)另请参见中的建议,而不是使用
    cut
    解析
    $query
    ,只需执行:
    read cmd input_file rements
    (确保IFS是一个合理的值)另请参见中的建议。