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

时间:2012-11-12 10:43:08

标签: 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"
    exit
fi
if [ $cmd = "summary" ]
then
    awk -f summary.awk $input_file $query
fi

让我说他进入

summary a.txt /o foo.txt

现在cmd变量的值为summaryinput_file的值为a.txt。 不是吗?

我希望summary.awk能够根据$input_file中的内容在$query上工作。

我的理解如下:

  1. 传递的第一个命令行参数被视为输入文件。 例如:awk 'code' file arg1 arg2 arg3 只有file被视为输入文件

  2. 如果输入文件是管道输入,则它不会将任何参数视为输入文件。 例如:cat file | awk 'code' arg1 arg2 arg3 arg1不被视为输入文件。

  3. 我是对的吗?

    问题是 我得awk: cannot open summary (No such file or directory) 为什么要尝试打开summary? 它是$input_file之后的下一个单词。

    如何解决此问题?

1 个答案:

答案 0 :(得分:3)

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

当且仅当没有输入文件参数时,它才从stdin读取输入。这意味着如果你输入awk并给它文件名参数,它将忽略管道。

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

试试这个:

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

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