web-dev-qa-db-ja.com

awkスクリプトの最後にある1の意味は何ですか

私はこのawkスクリプトを読んでいました

awk -F"=" '{OFS="=";gsub(",",";",$2)}1'

末尾の1の機能を知りたい

21
Mirage

awkプログラムは一連の条件とアクションのペアであり、条件は中括弧の外にあり、アクションはそれらで囲まれています。条件がゼロまたは空の文字列に評価される場合、条件はfalseと見なされます。その他の条件はすべてtrueです(初期化されていない変数は、コンテキストに応じて0または空の文字列なので、falseです)。条件またはアクションのいずれかを暗示することができます。条件のない中括弧(あなたの開始時)は真の条件があると見なされ、ヒットした場合は常に実行されます。アクションのない条件は、条件が満たされた場合にのみ行を出力します。

1スクリプトの最後にあるのはアクションのない条件(常にtrue)であるため、すべての行に対してデフォルトのアクションを実行し、行を出力します(前のアクションによって中括弧で変更されている可能性があります)。

27
Kevin

これらのタイプのショートカットは、パースの方法を難読化して誤解させるため、私は本当に嫌いです。 awk -F"=" '{OFS="=";gsub(",",";",$2)}1'のようなものを読んだとき、1が前のステートメントを変更していると思うかもしれません。または、1{print}のエイリアスであると考えるかもしれませんが、技術的に正しくありません。

実際には、1は完全に別のステートメントです。次のようにステートメントを分離できます。

awk -F"=" '
{OFS="="; gsub(",",";",$2)}
1
'

各awkステートメントの形式はcondition {action}です。 {action}が指定されていない場合、デフォルトのアクションは{print}です。 (conditionが指定されていない場合、デフォルトの条件はtrueです。)

したがって、ここでは1がゼロではないため、常にtrueと評価される条件です。 actionが省略されているため、デフォルトの{print}が実行されます。次のように考えることができます。

awk -F"=" '
{OFS="="; gsub(",",";",$2)}
1!=0 {print}
'
9
wisbucky

1は、すべての行を印刷することを意味します。

Awkステートメントは以下と同じです。

awk -F"=" '{OFS="=";gsub(",",";",$2);print $0;}'
6
Guru