Python 删除文本文件中不重复的行
我有一个特定范围内的100k+IP地址的长列表,此脚本中的一个示例是:Python 删除文本文件中不重复的行,python,linux,sorting,sed,uniq,Python,Linux,Sorting,Sed,Uniq,我有一个特定范围内的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.1
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次或更多次的所有IP。然后它将输出:
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。使用sort、uniq和awk:
使用排序、uniq和awk:
纯Python解决方案,使用来自的计数器工具 我不知道这将如何处理10万个地址,但你可以试一试
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时打印,并跳过所有后续显示:
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)
我怀疑第一个可能更快,但我还没有在一个大文件上尝试它来检查。纯Python解决方案,使用来自的计数器工具 我不知道这将如何处理10万个地址,但你可以试一试
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时打印,并跳过所有后续显示:
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)
我怀疑第一种可能更快,但我还没有在大文件上尝试过检查它。这里有一种在awk中进行检查的简单方法 对每个唯一的IP进行计数,并将数字存储在数组a中 如果点击次数超过4次,请打印。 它应该比排序uniq awk更快
PS我在发布这篇文章后确实看到了,这与jaypal在评论中发布的内容相同。这里有一个在awk中实现这一点的简单方法 对每个唯一的IP进行计数,并将数字存储在数组a中 如果点击次数超过4次,请打印。 它应该比排序uniq awk更快
PS我在发布这篇文章后确实看到了,这与jaypal在评论中发布的内容相同。似乎遗漏了一些内容,如果它们分散在一起,我在我的大列表中尝试了它,它似乎仍在复制一些内容+1:完全可以在awk中完成。awk“{ips[$0]+}END{ips中的ip如果ips[ip]>=5打印ip}”数据。TXT似乎遗漏了一些,如果它们分散了,我在我的大列表中尝试了它,它似乎复制了一些仍然+1:您可以完全在awk中完成。awk“{ips[$0]+}END{如果ips[ip]>=5打印ip}”data.txt,则为ips中的ip