14

ファイルを並べ替えずに重複を削除する-BASHから、順序を保持した重複行を削除する非常に便利な方法を学びました。

たとえば、次のファイルがある場合は、

$cat file
a
a
b
b
a
c

以下を使用して、重複する行を削除できます。

$awk '!x[$1]++' file
a
b
c

これは、操作の優先順位に関してどのように機能しますか?

4

2 に答える 2

22

式は次のように解析されます

!(x[$(1)]++)

つまり、裏返しにすると、次のようになります。

  • 現在の入力行のフィールド1を取得します(Perlとは異なり、AWKの演算子であることに$(1)注意してください)。$
  • xフィールド1の値でインデックスを作成します。xが非バインド変数の場合は、新しい連想配列にバインドします。
  • ポストインクリメントx[$(1)]; Cのルールと同様のルールが適用されるため、式の値は増分前の値になります。値がまだ割り当てられていないx[$(1)]場合はゼロになります。x[$(1)]
  • 前の値を否定します。これにより、x[$(1)]がゼロのときに真理が得られます。
  • x[$(1)]実際には、ゼロ以外の値を取得するように増分を実行します。したがって、次回はx[$(1)]、の同じ値に対して$(1)1を返します。

次に、この式は入力のすべての行に対して評価され、の暗黙のデフォルトアクションをawk実行する必要があるかどうかを判断します。これは、行をにエコーすることstdoutです。

于 2012-05-31T22:36:19.237 に答える
0

AWK 配列は連想配列であるため、各行の最初の列または最初のフィールド が$1配列のインデックスとして使用されxます。

于 2015-12-01T21:21:38.667 に答える