我在一定范围内有一长串100k +的IP地址,这个脚本的一个例子是:
67.0.105.76 0
67.0.123.150 0
67.0.123.150 0
67.0.123.150 0
67.0.123.150 0
67.0.123.150 0
67.0.123.150 0
67.0.123.150 0
67.0.123.150 0
67.0.105.76 0
67.0.123.150 0
67.0.163.127 0
67.0.123.150 0
67.0.163.127 0
67.0.163.127 0
67.0.163.127 0
67.0.163.127 0
67.0.163.127 0
67.0.163.127 0
67.0.163.127 0
67.0.163.127 0
67.0.163.127 0
67.0.105.76 0
67.0.105.76 0
67.0.105.76 0
67.0.232.158 0
67.0.232.158 0
67.0.232.158 0
67.0.232.158 0
67.0.232.158 0
67.0.232.158 0
67.0.232.158 0
67.0.232.158 0
67.0.232.158 0
67.0.232.158 0
67.0.105.76 0
67.0.143.13 0
从这个列表中我想要删除多次没有列出的任何IP,所以说我想删除上面列表中未列出5次或更多次的所有ips。然后输出:
67.0.105.76 0
67.0.123.150 0
67.0.163.127 0
67.0.232.158 0
我试图在Linux中使用sed / uniq来完成这个,但是无法找到一种方法来执行此操作,是否需要python脚本等,或者是否有可能使用sed / uniq?
使用sort -u 100kfile,它能够删除所有重复项,但它仍然留有单个ip。
答案 0 :(得分:4)
使用sort
,uniq
和awk
:
pu@pumbair: ~ sort data.txt | uniq -c | awk '{if ($1 > 4) print $2,$3}'
67.0.105.76 0
67.0.123.150 0
67.0.163.127 0
67.0.232.158 0
答案 1 :(得分:0)
纯Python解决方案,使用collections
module中的Counter
工具。
我不知道这将如何处理100k地址,但你可以试一试。
from collections import Counter
with open('ip_file.txt', 'r') as f:
ip_list = map(lambda x: x.strip(), f.readlines())
ip_by_count = Counter(ip_list)
for ip in ip_by_count:
if ip_by_count[ip] > 1:
print ip
或者另一种方法:维护两组,其中一组IP只看到一次,一组IP看到至少两次。当我们第二次看到IP时打印IP,并跳过所有后续出现:
known_dupes = set()
single_ips = set()
with open('ip_file.txt', 'r') as f:
ip_list = map(lambda x: x.strip(), f.readlines())
for ip in ip_list:
if ip in known_dupes:
continue
elif ip in single_ips:
print ip
known_dupes.add(ip)
single_ips.remove(ip)
else:
single_ips.add(ip)
我怀疑第一个可能更快,但我没有在大文件上试过它来检查。
答案 2 :(得分:0)
这是在awk
awk '{a[$0]++} END {for (i in a) if (a[i]>4) print i}' file
67.0.232.158 0
67.0.105.76 0
67.0.163.127 0
67.0.123.150 0
计算每个唯一的IP并将数字存储在数组a
中
如果有更多4
点击,请将其打印出来
它应该比sort
uniq
awk