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
在这里,我们正在做同样的操作,发现您seen before数字的最大。我们不是使用主块和END
块,而是使用通常用于处理一个文件和另一个文件的技术。 NR == FNR
条件只有在读取第一个文件时才是真实的,因为所有文件中每条文件的每行增加的记录编号(NR
)等于为每个新文件重置的文件记录编号(FNR
)。在与此条件相关的块中,计算每个数字出现的次数。 next
语句导致执行循环读取文件中的下一行。当到达第二个文件时,条件不再为真,并且该块将被跳过。
下一个条件(! flag
)将检查变量的内容是否为真。由于尚未设定,因此是错误的。感叹号取消了条件,所以此时执行进入该块。现在该标志被设置为在下一次检查条件时,该块将被跳过。 for
循环检查以查看哪个数字出现次数最多,就像我在回答您的其他问题时一样。
现在,第二个文件可以按照您喜欢的任何方式进行处理,变量max
可在此处理期间使用。我只是用一个print
声明来说明这一点。您仍可以像平常一样使用块选择器条件,包括一个或多个END
块。我没有显示BEGIN
块,但您可以在此脚本的顶部添加一个用于任何需要的初始化。请注意,第一个文件的处理可能已在BEGIN
块中使用getline
完成。这是完成同样事情的另一种技术。
文件名按照它们要处理的顺序列出。找到最大计数的文件称为“filetomax”。第二个文件,我做了主要处理我叫“filetoprocess”。
nanshi,我不清楚你想要达到的目标。 “尽可能找到第1列的最大频率”(6个“3”的事件),但是“辅助功能”是什么意思?你想对结果做什么? – ghoti
@ghoti,帮手函数我的意思是一个awk脚本中的一个函数来执行子任务,例如找到第1列的最大频率:) – trillions