Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 删除文本文件中不重复的行_Python_Linux_Sorting_Sed_Uniq - Fatal编程技术网

Python 删除文本文件中不重复的行

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

我有一个特定范围内的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次或更多次的所有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