2つのパターン(0と1)の間の最大値$ 4を見つけて変数に設定します。

2つのパターン(0と1)の間の最大値$ 4を見つけて変数に設定します。

.txtをフィルタリングするために.awkソースファイルを作成しようとしていますが、2番目のコマンドでmax変数を使用する方法を知りたいです。

BEGIN {max1=0} 

2つのパターン(0と1)の間の最大値$ 4を見つけて変数に設定します。

{if ($4>0 && $4<1)
max1=$4
else if ($4==1)
max=max1}
END {print max}

/Nodes/ {f=1} /EndNodes/ {f=0} #Gives lines after Nodes and before EndNodes
{if ($2+0>=0 && $3+0==0 && max==$4)  #Filters the given lines between Nodes and EndNodes
{print $1}}

私の考えでは、max変数を定義した後、最初からプログラムを実行する必要があるようです。 (2番目のコマンドと同じ行を使用するためです。)

予想される出力は次のとおりです。20、31、32

入力する

$Nodes
  34
   1  0.0000000E+000  0.0000000E+000  0.0000000E+000
   2  6.0000000E-003  0.0000000E+000  0.0000000E+000
   3  0.0000000E+000  6.0000000E-003  0.0000000E+000
   4 -6.0000000E-003  0.0000000E+000  0.0000000E+000
   5  0.0000000E+000 -6.0000000E-003  0.0000000E+000
   6  2.1213203E-003  2.1213203E-003  0.0000000E+000
   7 -2.1213203E-003  2.1213203E-003  0.0000000E+000
   8 -2.1213203E-003 -2.1213203E-003  0.0000000E+000
   9  2.1213203E-003 -2.1213203E-003  0.0000000E+000
  10  4.2426407E-003  4.2426407E-003  0.0000000E+000
  11 -4.2426407E-003  4.2426407E-003  0.0000000E+000
  12 -4.2426407E-003 -4.2426407E-003  0.0000000E+000
  13  4.2426407E-003 -4.2426407E-003  0.0000000E+000
  14  2.1213203E-003  0.0000000E+000  0.0000000E+000
  15  0.0000000E+000  2.1213203E-003  0.0000000E+000
  16 -2.1213203E-003  0.0000000E+000  0.0000000E+000
  17  0.0000000E+000 -2.1213203E-003  0.0000000E+000
  18  0.0000000E+000  2.1213203E-003  6.0000000E-003
  19  0.0000000E+000  6.0000000E-003  6.0000000E-003
  20  0.0000000E+000  0.0000000E+000  6.0000000E-003
  21 -4.2426407E-003  4.2426407E-003  6.0000000E-003
  22 -2.1213203E-003  2.1213203E-003  6.0000000E-003
  23 -6.0000000E-003  0.0000000E+000  6.0000000E-003
  24 -2.1213203E-003  0.0000000E+000  6.0000000E-003
  25 -4.2426407E-003 -4.2426407E-003  6.0000000E-003
  26 -2.1213203E-003 -2.1213203E-003  6.0000000E-003
  27  0.0000000E+000 -6.0000000E-003  6.0000000E-003
  28  0.0000000E+000 -2.1213203E-003  6.0000000E-003
  29  4.2426407E-003 -4.2426407E-003  6.0000000E-003
  30  2.1213203E-003 -2.1213203E-003  6.0000000E-003
  31  6.0000000E-003  0.0000000E+000  6.0000000E-003
  32  2.1213203E-003  0.0000000E+000  6.0000000E-003
  33  4.2426407E-003  4.2426407E-003  6.0000000E-003
  34  2.1213203E-003  2.1213203E-003  6.0000000E-003
$EndNodes
$Elements
#And some more data
$EndElements

ベストアンサー1

ワンタイムソリューションは次のとおりです。

/Nodes/         { read = 1 }
/EndNodes/      { read = 0 }

!read           { next     }

NF == 4                         { n = $1; x = $2; y = $3; z = $4 }
z > max                         { delete set; i = 1; max = z     }
x >= 0 && y == 0 && z == max    { set[i++] = n                   }

END             { for (i in set) { print set[i] } }

このread変数は、現在のレコードに対して操作を実行する必要があるかどうかを決定します。 1の場合はこれを行います。

現在の入力に興味がない場合、3番目のブロックは現在の入力を破棄し、上から次のレコードを処理し続けます。

ブロック4は4つの便利な変数、nおよびxを設定しますy。他よりz読みやすいです。$1

ブロック5では、配列を削除しますset。このset配列は、条件を満たすこれまでに見つかったすべてのノード番号の集まりです。新しい最大値が見つかると、このブロックが実行されるため、z以前に見つかったすべてのノードは無効になります。また、新しい最大値(max)を保存します。変数はi単に配列のインデックスです(デフォルトではカウンタ)。最大値が見つからない場合、max初期化されていない値はテストでゼロとして扱われます。

条件を満たすノードが見つかると、6番目のブロックが実行されます。ノード番号は配列に格納さsetれ、インクリメントされiます。

set最後に、配列を繰り返してその内容を印刷します。

GNUで実行した結果はawk次のとおりです。

20
31
32

BSDawkmawkOpenBSD で実行すると、リストは逆順に生成されます。

おすすめ記事