私はこのawkスクリプトを読んでいました
awk -F"=" '{OFS="=";gsub(",",";",$2)}1'
末尾の1
の機能を知りたい
awk
プログラムは一連の条件とアクションのペアであり、条件は中括弧の外にあり、アクションはそれらで囲まれています。条件がゼロまたは空の文字列に評価される場合、条件はfalseと見なされます。その他の条件はすべてtrueです(初期化されていない変数は、コンテキストに応じて0または空の文字列なので、falseです)。条件またはアクションのいずれかを暗示することができます。条件のない中括弧(あなたの開始時)は真の条件があると見なされ、ヒットした場合は常に実行されます。アクションのない条件は、条件が満たされた場合にのみ行を出力します。
1
スクリプトの最後にあるのはアクションのない条件(常にtrue)であるため、すべての行に対してデフォルトのアクションを実行し、行を出力します(前のアクションによって中括弧で変更されている可能性があります)。
これらのタイプのショートカットは、パースの方法を難読化して誤解させるため、私は本当に嫌いです。 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}
'
1
は、すべての行を印刷することを意味します。
Awkステートメントは以下と同じです。
awk -F"=" '{OFS="=";gsub(",",";",$2);print $0;}'