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
コマンドとフォーマットも>>
シェルがこれらのトークンを処理する方法に触発されましたが、これらのフォーマットの詳細についてはドキュメントを参照してください。|
print
awk
あなたのコードに
print 3 > 5 ? "Hello" : "World"
これは構文と一致するため、というprint > expression
文字列を出力します。行の残りの部分には理解できない疑問符が表示され続けているため、これについて文句を言います。いくつかの実装では、このビットを3
5
awk
awk
5 ? "Hello" : "World"
expression
3
Hello
5
本物ブール値として使用される場合の値)。
あなたが一番したいことは
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")}'