2012-06-03 48 views
1

我没有找到有关此主题的任何明确的教程。假设我有一个输入文件:awk - 两个脚本如何相互交互?

1 abc 
1 def 
1 ghi 
1 lalala 
1 heyhey 
2 ahb 
2 bbh 
3 chch 
3 chchch 
3 oiohho 
3 nonon 
3 halal 
3 whatever 

假设我想查找第一列出现的最大数目,即出现6次的“3”。然后,我需要将这个数字(即6)提供给另一个脚本来完成一些计算。有什么办法做到这一点?

基本上,我不知道是否有可能编写一个函数来检查文件,然后在调用辅助函数的主函数中找到“max”。另外,我想知道是否可以在助手函数中使用$(...)来调用'awk'或其他系统函数?

+0

nanshi,我不清楚你想要达到的目标。 “尽可能找到第1列的最大频率”(6个“3”的事件),但是“辅助功能”是什么意思?你想对结果做什么? – ghoti

+0

@ghoti,帮手函数我的意思是一个awk脚本中的一个函数来执行子任务,例如找到第1列的最大频率:) – trillions

回答

1
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”。

+0

这是一个非常详细的解释:)。非常感谢!我会试试这个。同时,你认为Python比awk更好地执行这样的任务吗?祝你有美好的一天!并非常感谢您的帮助:) – trillions

+0

谢谢丹尼斯! :) – trillions

0

我们使用管道为此。它将第一个进程的标准输出连接到第二个进程的标准输入。

awk ... | awk ...