3

正規表現の解読を手伝ってください-

'!_[$0]++'

次の使用法で MSISDN を取得するために使用されます (ゼロから始まる MSISDN のリストを含むファイルから一度に 1 つずつ)。

awk '!_[$0]++' file.txt
4

3 に答える 3

6

これは正規表現ではなく、算術およびブール式です。

  • $0= 現在の入力行
  • _[$0]= キーが入力行である連想配列要素
  • _[$0]++= 行の繰り返しに遭遇するたびにその配列要素をインクリメントしますが、元の値に評価されます
  • !_[$0]++= ブール値の逆なので、値が元々 0 または空の文字列だった場合は true を返し、それ以外の場合は false を返します。

したがって、この式は、行が最初に検出されたときは true になり、2 回目以降は false になります。式の後にアクション ブロックがないため、デフォルトでは、式が true の場合は行が出力され、false の場合はスキップされます。

したがって、これは重複を省略して入力ファイルを出力します。

于 2013-08-16T07:13:25.447 に答える
1
'true'- then the line will be printed

'_[$0]++'- associative array will be incremented everytime when $0 is present.means it will set the number of times each line is repeated.

'!_[$0]++'-this will be true when a line is inserted in the associative array for the firsttime only and the rest of the times it will resolve to false ultimately not printing the line.

したがって、すべての重複行は印刷されません。

于 2013-08-16T07:11:46.253 に答える
1

これは正規表現ではありません。この特定のコマンドは、最初に見つかった一意の行を出力します。

_ここでは配列として使用されて$0おり、行全体を参照しています。配列要素のデフォルトの数値が0(技術的には空の文字列ですが、数値コンテキストでは 0 として扱われます) とすると、最初に行が表示されたときに、その行を出力します (_[$0]は false であるため、!_[$0]true になります)。コマンドは行が表示されるたびにインクリメントされます (印刷後 -- awk のデフォルト コマンドは印刷です)。そのため、次に行が表示_[$0]1れ、行は印刷されません。

于 2013-08-16T07:13:14.870 に答える