删除文本文件中的非重复行

时间:2014-09-05 22:30:52

标签: 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.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。

3 个答案:

答案 0 :(得分:4)

使用sortuniqawk

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

更快 PS我在发布之后确实看到了它,就像jaypal在评论中发布的那样。