0

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

#!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_filea.txt. 不是吗?

我希望 summary.awk$input_file根据$query.

我的理解如下:

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

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

我对吗?

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

我该如何解决这个问题?

4

1 回答 1

3

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

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

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

试试这个:

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

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

于 2012-11-12T11:02:42.160 回答