按另一列的值计算一个列组的值数
Count number of values of one column group by value of another column
我有一个这样的文本文件:
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
有没有一种方法可以使用 Linux Bash 命令计算一个唯一域上的唯一 ip 数并得到这样的结果?
domain|count_ip
solusi-it.com|3
samtimes.ru|1
karosel-ind.com|1
es350.co.kr|1
应该这样做:
cat data | tail -n+2 | awk -F'|' '{print " "}' | sort | uniq | awk '{print }' | uniq -c | awk '{ print "|"}'
它基本上删除了 header,然后打印 IP 和主机,找到唯一的对 {ip, host},按主机分组对它们进行计数并格式化它们。
编辑:更正格式
使用 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
您可以使用 Field separator 以 |
分隔字段。
这不会检查 ip 是否已经在数组 a
中。
为此,您可以使用 sort
来测试第 3 和第 4 字段的唯一性:
~$ cat f f >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
与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 的 HASH
$domains->{$F[3]}->{$F[2]}++
$F[3]
是域,$F[2]
是 IP。唯一性是保证。哈希键始终是唯一的。
输出:
domain|count_ip
es350.co.kr|1
karosel-ind.com|1
samtimes.ru|1
solusi-it.com|3
我有一个这样的文本文件:
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
有没有一种方法可以使用 Linux Bash 命令计算一个唯一域上的唯一 ip 数并得到这样的结果?
domain|count_ip
solusi-it.com|3
samtimes.ru|1
karosel-ind.com|1
es350.co.kr|1
应该这样做:
cat data | tail -n+2 | awk -F'|' '{print " "}' | sort | uniq | awk '{print }' | uniq -c | awk '{ print "|"}'
它基本上删除了 header,然后打印 IP 和主机,找到唯一的对 {ip, host},按主机分组对它们进行计数并格式化它们。
编辑:更正格式
使用 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
您可以使用 Field separator 以 |
分隔字段。
这不会检查 ip 是否已经在数组 a
中。
为此,您可以使用 sort
来测试第 3 和第 4 字段的唯一性:
~$ cat f f >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
与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 的 HASH
$domains->{$F[3]}->{$F[2]}++
$F[3]
是域,$F[2]
是 IP。唯一性是保证。哈希键始终是唯一的。
输出:
domain|count_ip
es350.co.kr|1
karosel-ind.com|1
samtimes.ru|1
solusi-it.com|3