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
条件仅在读取第一个文件时为真,因为NR
在所有文件中为每一行增加的记录号 ( ) 共同等于FNR
为每个新文件重置的文件记录号 ( )。在与此条件相关的块中,计算每个数字出现的次数。该next
语句导致执行循环以从文件中读取下一行。当到达第二个文件时,条件不再为真,将跳过此块。
下一个条件 ( ! flag
) 检查变量的内容是否为真。因为没有设置,所以是假的。感叹号否定条件,因此此时执行移至该块。现在设置了标志,因此下次检查条件时,将跳过此块。循环检查哪个数字出现的for
次数最多,就像我对您的另一个问题的回答一样。
现在,可以以您喜欢的任何方式处理第二个文件,并且可以max
在此处理期间使用该变量。我只是用一个print
陈述来说明这一点。您仍然可以END
像往常一样使用块选择器条件,包括一个或多个块。我没有显示一个BEGIN
块,但是您可以在此脚本的顶部添加一个块以进行所需的任何初始化。请注意,第一个文件的处理可以在BEGIN
块中使用getline
. 这只是完成同一件事的另一种技术。
文件名按它们要处理的顺序列出。找到最大计数的文件我称为“filetomax”。对我进行主要处理的第二个文件称为“filetoprocess”。