0

これは、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。そうじゃない?

$input_fileに存在するものに基づいて、summary.awk が動作するようにし$queryます。

私の理解は次のとおりです。

  1. 渡された最初のコマンド ライン引数は、入力ファイルとして扱われます。例:awk 'code' file arg1 arg2 arg3 のみfileが入力ファイルとして扱われます

  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場合、スクリプトはそのファイルから取得され、残りは入力ファイルです。

入力ファイルの引数がない場合にのみ、stdinから入力を読み取ります。つまり、awkにパイプし、それにfilename引数を指定すると、パイプは無視されます。

これは、ほとんどのUnixファイル処理コマンドと同じです。

これを試して:

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

これにより、awk変数queryがクエリの内容に設定されます。

于 2012-11-12T11:02:42.160 に答える