行1:ifまたはその近くで構文エラーが発生しました。

行1:ifまたはその近くで構文エラーが発生しました。

treat.awkの私のコードは次のとおりです。

#!/usr/bin/awk -f
if($1 == "x") cat file

コマンドプロンプトへの私の入力は次のとおりです。

~/home/treat.awk x

次のエラーメッセージが表示されます。

line 1: syntax error at or near if

どうすれば修正できますか?このコードはawkを使用しており、既存のバージョンのawkのみが許可されています。
ファイルには「テスト」。

答え1

それはawkコードではなくcshコードです。シャバンに変えて

#! /bin/csh -f
if($1 == "x") cat file

(これは、-fのようにファイルをパラメータとして使用しませんが、awkユーザーの読み込みはしません~/.cshrc。)

同じことを行うコードはawk次のとおりです。

#! /usr/bin/awk -f
BEGIN {
  if (ARGV[1] == "x") exit(system("cat file"))
}

合格するとawkの伝統的なバージョン、Solarisなどの1985年以前の非POSIXバージョンを意味する場合、パラメータを参照せずに参照/bin/awkできないため、これを行うことはできません(パラメータを入力ファイルとして扱う場合を除く)。 Solarisでは、次のように標準に近づきたいと思います。ARGVFILENAME/usr/xpg4/bin/awkawkmawk伝統的なバージョンawkそして構文は実際にサポートされています。

これで、system()実際にはコマンドラインshを解釈するためにシェルを呼び出すので、次のすべての操作を実行することをお勧めします(今世紀にする必要があるよりもはるかに優れています)。cat fileshcsh

#! /bin/sh -
if [ "$1" = x ]; then
  cat file
fi

¹、また!で始まるいくつかのパラメータはオプションとして扱われ-ますawk。 GNUでは、she-bangを使用してこの問題を解決awkできます。#! /usr/bin/gawk -E

関連情報