awk如何区分参数和输入文件?
这是我的shell脚本,它从stdin接收一个字符串作为用户的输入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"
#!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是一个合理的值)另请参见中的建议。