awk 'NR == FNR {nums[$1]++; next} ! flag {flag = 1; for (num in nums) {if (nums[i] > max) {max = nums[i]}}} {print max * $3}' filetomax filetoprocess
ここでは、複数の行に分かれています。
awk '
NR == FNR {
nums[$1]++;
next
}
! flag {
flag = 1;
for (num in nums) {
if (nums[i] > max) {
max = nums[i]
}
}
}
{
print max * $3
}
' filetomax filetoprocess
ここでは、以前に見た数の最大値を見つけるために同じ操作を行っています。メインブロックとブロックを使用する代わりに、END
あるファイルを処理してから別のファイルを処理するためによく使用される手法を使用しています。すべてのファイルの行ごとに増分されるレコード番号()は、新しいファイルごとにリセットされるファイルレコード番号()と等しいため、このNR == FNR
条件は最初のファイルが読み取られている間のみ真になります。この状態に関連するブロックで、各番号が表示される回数を数えます。このステートメントにより、実行がループし、ファイルから次の行が読み取られます。2番目のファイルに到達すると、条件は真ではなくなり、このブロックはスキップされます。NR
FNR
next
次の条件付き(! flag
)は、変数の内容がtrueであるかどうかを確認します。設定されていないので誤りです。感嘆符は条件を否定するため、この時点で実行はこのブロックに移動します。これでフラグが設定され、次に条件がチェックされたときにこのブロックはスキップされます。ループは、他の質問に対する私の回答のように、どの番号が最も頻繁に出現したfor
かを確認します。
これで、2番目のファイルを任意の方法で処理でき、max
この処理中に変数を使用できるようになります。私は単にprint
それを説明するためにステートメントを使用しました。END
通常どおりに1つ以上のブロックを含め、ブロックセレクター条件を引き続き使用できます。ブロックは表示しませんBEGIN
が、必要な初期化のために、このスクリプトの先頭にブロックを追加できます。最初のファイルの処理は、BEGIN
を使用してブロックで実行できた可能性があることに注意してくださいgetline
。これは、同じことを達成するための単なる別の手法です。
ファイル名は、処理される順序でリストされています。私が「filetomax」と呼んでいる最大数を見つけるためのファイル。「filetoprocess」と呼ばれる、メイン処理を実行する2番目のファイル。