awk '{for(x=1;x<=NF;x++)if($x~/0.00000/){sub(/0.00000/,++i)}}1' ファイルコマンドを理解する方法

awk '{for(x=1;x<=NF;x++)if($x~/0.00000/){sub(/0.00000/,++i)}}1' ファイルコマンドを理解する方法

このコマンドは次のとおりです。

awk '{for(x=1;x<=NF;x++)if($x~/0.00000/){sub(/0.00000/,++i)}}1'

このコマンドは、ファイル内の「0.00000」を見つけて、1から始まる増分数で置き換えることを知っています。 'x<=NF' と末尾の数字 1 "{sub(/0.00000/ ,++i)}}1" を除くほとんどすべてを理解します。

また、同じことをしたいのですが、一致を0から始まる増分数に置き換える場合は、これが正しいです。

awk '{for(x=0;x<=NF;x++)if($x~/0.00000/){sub(/0.00000/,++i)}}1' file

ベストアンサー1

NF値が現在のレコードのフィールド数に設定された内部 Awk 変数です。だから

for(x=1;x<=NF;x++)

すべてのフィールドを繰り返します。式の末尾の数字は、パターンが1「true」と評価されたときに基本操作を使用してレコード全体を印刷する簡単な方法です。

awkルールでは、モードまたはアクションのいずれかを省略できますが、両方を省略することはできません。モードを省略すると、入力ラインごとに演算が行われます。このジョブを省略すると、デフォルトのジョブはパターンに一致するすべての行を印刷することです。1

0代わりに、数値の増加を開始するには、1プレフィックスを++iサフィックスに置き換えることができますi++

awk '{for(x=1;x<=NF;x++)if($x~/0.00000/){sub(/0.00000/,i++)}}1'

前任者。

$ echo 'foo 0.00000123 bar' | awk '{for(x=1;x<=NF;x++)if($x~/0.00000/){sub(/0.00000/,++i)}}1'
foo 1123 bar

しかし、

$ echo 'foo 0.00000123 bar' | awk '{for(x=1;x<=NF;x++)if($x~/0.00000/){sub(/0.00000/,i++)}}1'
foo 0123 bar
$

  1. GNU Awkユーザーガイド:1.3いくつかの簡単な例

おすすめ記事