如何使用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 列中。它们不执行正则表达式检查等,以查看它们是否真的看起来像地址。
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 列中。它们不执行正则表达式检查等,以查看它们是否真的看起来像地址。