按另一列的值计算一个列组的值的数量

我有这样的文本文件:

asn|prefix|ip|domain 25008|85.192.184.0/21|85.192.184.59|solusi-it.com 25008|85.192.184.0/21|85.192.184.59|samtimes.ru 131755|103.31.224.0/24|103.31.224.58|karosel-ind.com 131755|103.31.224.0/24|103.31.224.58|solusi-it.com 9318|1.232.0.0/13|1.234.91.168|solusi-it.com 9318|1.232.0.0/13|1.234.91.168|es350.co.kr 

有没有一种方法,我可以计数独特的ips与Linux Bash命令的唯一域上的数量,并得到这样的结果?

 domain|count_ip solusi-it.com|3 samtimes.ru|1 karosel-ind.com|1 es350.co.kr|1 

用perl :

 perl -F'\|' -lane ' $. > 1 and $domains->{$F[3]}->{$F[2]}++; END{ print "domain|count_ip"; print $_, "|", scalar keys %{ $domains->{$_} } for keys %$domains; } ' file | tee new_file 

这背后的想法是使用HASH的哈希

 $domains->{$F[3]}->{$F[2]}++ 

$F[3]是域, $F[2]是IP。 唯一性是保证。 一个HASH键总是唯一的。

OUTPUT:

 domain|count_ip es350.co.kr|1 karosel-ind.com|1 samtimes.ru|1 solusi-it.com|3 

使用awk:

 ~$ awk -F'|' 'NR>1{a[$NF]++}END{print "domain|count_ip";for (i in a){print i FS a[i]}}' f domain|count_ip karosel-ind.com|1 solusi-it.com|3 samtimes.ru|1 es350.co.kr|1 

您可以使用字段分隔符将字段用|分隔 。
这不会检查IP是否已经在数组中。

为了做到这一点,你可以使用sort来测试第三和第四领域的唯一性:

 ~$ cat ff >f2 ~$ sort -t'|' -k3,4 -u f2 | awk -F'|' 'NR>1{a[$NF]++}END{print "domain|count_ip";for (i in a){print i FS a[i]}}' domain|count_ip solusi-it.com|3 samtimes.ru|1 es350.co.kr|1 domain|1 

这应该做到这一点:

  cat data | tail -n+2 | awk -F'|' '{print $4" "$3}' | sort | uniq | awk '{print $1}' | uniq -c | awk '{ print $2"|"$1}' 

它基本上删除头,然后打印IP和主机,找到唯一的对(IP,主机),统计他们与主机分组和格式化。

编辑:更正格式