AWKがこの条件文にエラーを表示するのはなぜですか?

AWKがこの条件文にエラーを表示するのはなぜですか?

2番目のawk onelinerでは、単に<forを切り替えましたが、>構文エラーが発生しました。>条件文には許可されていませんか?

~/Desktop $ awk 'BEGIN{print 3<5 ? "Hello":"World"}'
Hello
~/Desktop $ 
~/Desktop $ awk 'BEGIN{print 3>5 ? "hello": "world"}'
awk: cmd. line:1: BEGIN{print 3>5 ? "hello": "world"}
awk: cmd. line:1:                 ^ syntax error
~/Desktop $
~/Desktop $ awk 'BEGIN{print 5<3 ? "Hello":"World"}'
World
~/Desktop $
~/Desktop $

答え1

printステートメントは3つの形式のうちの1つを取りますawk

  • print > expression
  • print >> expression
  • print | expression

...ここで>>>および次のビットはオプションです|expression

このコマンドを使用すると、計算結果の文字列で指定されたファイルprint > expressionに出力が移動されます。expressionファイルが存在する場合は切り捨てられます(空になります)。これは、シェルで出力リダイレクトがどのように機能するかと同じように機能しますが、print同じステートメントを2回実行すると、最初に関連するファイルをclose(expression)閉じるために使用されない限り、ファイルは切り捨てられません。expression

コマンドとフォーマットも>>シェルがこれらのトークンを処理する方法に触発されましたが、これらのフォーマットの詳細についてはドキュメントを参照してください。|printawk

あなたのコードに

print 3 > 5 ? "Hello" : "World"

これは構文と一致するため、というprint > expression文字列を出力します。行の残りの部分には理解できない疑問符が表示され続けているため、これについて文句を言います。いくつかの実装では、このビットを35awkawk5 ? "Hello" : "World"expression3Hello5本物ブール値として使用される場合の値)。

あなたが一番したいことは

print ( 3 > 5 ? "Hello" : "World" )

または

print ( 3 > 5 ) ? "Hello" : "World"

これによりprint > expression構文がトリガーされません。

答え2

プレゼンテーションにのみテキストを使用してください。

式の周りに括弧を使用します。

$ awk 'BEGIN{print (5>3 ? "Hello":"World")}'
Hello
$ awk 'BEGIN{print (3>5 ? "Hello":"World")}'
World

おそらく>、文字は印刷コマンドにリダイレクトされたファイルとして解釈されます。

答え3

あなたのコードには、出力リダイレクトの右側に括弧で囲まれていない三項式があるかもしれません。 2つの質問があります。

  • 出力(または入力)リダイレクトの右側で括弧で囲まれていない式をリダイレクトすることは、POSIXの未定義の動作であるため、絶対にしてはいけません。
  • 括弧で囲まれた三項式は、括弧で囲まれた三項式よりも読みにくく、一部のコンテキストでは一部のawksで構文エラーを引き起こす可能性があるため、そうしないでください。

悪い:

print > foo bar
getline < foo bar
str = x>y ? foo : bar

いいね:

print > (foo bar)
getline < (foo bar)
str = (x>y ? foo : bar)

ただし、複数の出力ファイルを生成する場合は、通常、実行時にそのファイルを閉じてから、出力ファイル名を変数の式の結果として保存し、角かっこなしで保存することをお勧めします。たとえば、次のようになります。

out = foo bar
print > out
close(out)

したがって、あなたのコードは次のようになります。

awk 'BEGIN{print 3<5 ? "Hello" : "World"}'
awk 'BEGIN{print 3>5 ? "hello" : "world"}'
awk 'BEGIN{print 5<3 ? "Hello" : "World"}'

実行する必要がある操作に応じて、出力リダイレクトの右側に括弧を使用しないか、トリプルの周りに括弧を使用しないか、またはその両方であるため、次のように記述する必要があります。

awk 'BEGIN{print (3<5 ? "Hello" : "World")}'
awk 'BEGIN{print (3>5 ? "hello" : "world")}'
    or, less likely, awk 'BEGIN{print 3 > (5 ? "hello" : "world")}'
awk 'BEGIN{print (5<3 ? "Hello" : "World")}'

関連情報