AWK - 如何将两个脚本互相交流?(awk - how two scripts interact

2019-10-16 18:53发布

我没有找到有关这个主题的任何明确的教程。 说我有一个输入文件:

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

说我想找到一个列的最大数量首次出现,这是“3”即出现了6次。 然后,我就需要这个数(即6)喂到另一个脚本去通过文件做一些计算。 什么是做到这一点的方法吗?

基本上,我不知道是否有可能写一个函数去通过文件,并找到“最大”,然后在主函数中调用的辅助函数。 另外,我不知道是否有可能做辅助函数中的$(...)来调用“的awk”或其他系统的功能呢?

Answer 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

在这里,我们正在做同样的操作,发现你的号码的最大见过 。 而不是使用一个主块和的END块,我们使用的常常用来处理一个文件,然后其他的技术。 该NR == FNR而第一个文件是只读的条件是唯一的真,因为记录号( NR时递增中所有文件的每一行)集体等于文件记录号( FNR ),这是复位每个新文件。 与此病症相关的块中,计数出现的每个号码的时间。 在next语句使执行循环来读取文件的下一行。 当到达第二个文件,条件不再成立,这个块将被跳过。

接下来的条件( ! flag )检查是否变量的内容是真实的。 由于尚未确定,这是假的。 感叹号否定条件,使得在这一点上执行移动到该块。 现在,该标志设置这样的条件检查接下来的时间,此块将被跳过。 在for循环检查,看看哪个号码出现的次数最多,为我的回答您的其他问题。

现在,第二个文件可以在任何你喜欢的方式进行处理和变量max可使用此处理过程中。 我只是用一个print语句来说明。 您仍然可以使用块选择条件语句,包括一个或多个END块,你通常会。 我不显示BEGIN块,但你可以在此脚本你需要的任何初始化的顶部添加一个。 需要注意的是第一个文件的处理可在已经完成BEGIN使用块getline 。 这只是为了完成同样的事情的另一种技术。

文件名中列出了他们将被处理的顺序。 该文件以找到最大计数我叫“filetomax”。 第二档主做处理上我叫“filetoprocess”。



Answer 2:

我们用一个这个。 它采用第一工艺的标准输出并把它连接到所述第二的标准输入。

awk ... | awk ...


文章来源: awk - how two scripts interact with each other?