如何使用awk比较一行的两列与另一行的相同两列?我还可以计算相同的行数吗

How to compare two columns of a row with same two columns of other row using awk? Can I also get the count the identical rows

Oct 7     02:55:20       123.111.44.77     99        123.111.66.91 12345    
Oct 7     02:58:10       123.111.44.77     99        123.111.66.98 48575   
Oct 7     02:05:40       123.111.44.77     99        123.111.66.99 09876   
Oct 7     02:50:40       123.111.44.77     99        123.111.66.99 56743    
Oct 7     02:53:00       123.111.44.77     99        123.111.66.12 98475   
Oct 7     02:58:00       123.111.44.77     99        123.111.66.98 12489

这是输入。

要求的输出是:

     123.111.44.77       123.111.66.99 (2)     
     123.111.44.77       123.111.66.98 (2)

我如何使用 AWK 来实现?

提前谢谢你。

在 AWK 中,

$ awk '{c[]++}c[]>1{d[]=}END{for(x in d)printf "%s\t%s (%s)\n",d[x],x,c[x]}' infile

这会产生

123.111.44.77   123.111.66.99 (2)
123.111.44.77   123.111.66.98 (2)

您可以调整输出格式。我用制表符分隔前两个字段,用单个 space 分隔第二个和第三个(计数)。您的示例输出看起来有点像这样。

以上计算右侧地址(第 6 列)出现的次数,并打印出现次数超过一次的地址以及左侧地址(第 4 列)最后一次出现的地址(以及在括弧)。进一步思考,这可能不是您想要的。 (如果是,那就太好了!)


如果您想计算左右地址(第 4 列和第 6 列)的 ,请尝试

$ awk '{c["\t"]++}END{for(x in c)printf "%s (%d)\n",x,c[x]}' infile

这将打印每个配对,并在括号中记录出现次数。如果您只想要出现多次的配对,则添加 if 条件:

$ awk '{c["\t"]++}END{for(x in c)if (c[x]>1){printf "%s (%d)\n",x,c[x]}}' infile

请注意,所有这些都假定您想要的地址在第 4 列和第 6 列中。它们不执行正则表达式检查等,以查看它们是否真的看起来像地址。