.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
BSDawk
とmawk
OpenBSD で実行すると、リストは逆順に生成されます。