awk '!a[$0]++' はどのように機能しますか?

awk '!a[$0]++' はどのように機能しますか?

この行は、事前ソートなしでテキスト入力から重複した行を削除します。

たとえば、

$ cat >f
q
w
e
w
r
$ awk '!a[$0]++' <f
q
w
e
r
$ 

インターネットで見つけたソースコードは次のとおりです。

awk '!_[$0]++'

Perlのようにawkでも特別な意味があると思っていましたが、わかり_ましたら配列の名前だけだったからです。

今、私はこの文の論理を理解しています。 各入力行はハッシュ配列のキーとして使用されるため、完了するとハッシュに到着順に一意の行が含まれます。

私が知りたいのは、awkがこのシンボルをどのように解釈するかです。たとえば、!感嘆符()の意味と、このコードスニペットの他の要素です。

どのように動作しますか?

ベストアンサー1

これは「直感的な」答えです。 awkのメカニズムの詳細については、@Cuonglmのを参照してください。

この場合、!a[$0]++後増分は++別に設定できます。式の値は変更されません。だからここを見てください!a[$0]

a[$0]

現在の行を$0配列のキーとして使用しa、そこに格納されている値を取得します。この特定のキーが以前に参照されたことがない場合は、空のa[$0]文字列として評価されます。

!a[$0]

!以前の値を否定します。空または0(偽)の場合、真の結果が得られます。 0以外の場合(true)、誤った結果が得られます。完全な式がtrueと評価された場合(つまり、a[$0]開始するように設定されていないことを意味)、行全体がデフォルトのジョブとして印刷されます。

また、事後増加演算子は前の値に関係なく 1 ずつ増加するため、a[$0]次に配列の同じ値にアクセスすると正数になり、全体条件が失敗します。

おすすめ記事