V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
holinhot
V2EX  ›  Python

请教如何删除 6 万 txt 中重复的行

  •  
  •   holinhot · 2015-04-23 11:34:09 +08:00 · 9738 次点击
    这是一个创建于 3507 天前的主题,其中的信息可能已经有所发展或是发生改变。

    文本1中:

    123.com.     3600    IN      SOA     ns1.dns.com. dns.dns.com. 1419473850 3600 3600 3600 3600
    123.com.     3600    IN      A       2.2.2.2
    123.com.     3600    IN      NS      ns2.dns.com.
    123.com.     3600    IN      NS      ns1.dns.com.
    123.com.     3600    IN      SOA     ns1.dns.com. dns.dns.com. 1419473850 3600 3600 3600 3600
    

    文本2中

    aaaa.com.     3600    IN      SOA     ns1.youdns.com. dns.youdns.com. 1419473850 3600 3600 3600 3600
    aaaa.com.     3600    IN      A       11.1.1.1.1
    aaaa.com.     3600    IN      NS      ns2.youdns.com.
    aaaa.com.     3600    IN      NS      ns1.youdns.com.
    aaaa.com.     3600    IN      SOA     ns1.youdns.com. dns.youdns.com. 1419473850 3600 3600 3600 3600
    

    删除每个文本中重复的行
    像文本1中

    123.com.     3600    IN      SOA     ns1.dns.com. dns.dns.com. 1419473850 3600 3600 3600 3600
    

    这行重复了去掉重复的一行

    文本2中

    aaaa.com.     3600    IN      SOA     ns1.youdns.com. dns.youdns.com. 1419473850 3600 3600 3600 3600
    

    重复了 去掉重复的一行。
    我也不知道为什么为有两条SOA记录 真是奇怪

    66 条回复    2015-04-24 16:48:18 +08:00
    holinhot
        1
    holinhot  
    OP
       2015-04-23 11:35:41 +08:00
    不能说固定删除第几行,这个行不通 因为每个域名的解析记录条数有多有少
    magicianzrh
        2
    magicianzrh  
       2015-04-23 11:37:17 +08:00   ❤️ 1
    每读入一行 一行文字md5一下作为key,就可以检查了
    ksupertu
        3
    ksupertu  
       2015-04-23 11:38:28 +08:00   ❤️ 1
    uniq命令加管道重定向输出文件
    airqj
        4
    airqj  
       2015-04-23 11:38:59 +08:00   ❤️ 1
    sort -u
    ob
        5
    ob  
       2015-04-23 11:40:40 +08:00
    话说搭个hadoop环境是否可行。。
    ob
        6
    ob  
       2015-04-23 11:41:59 +08:00
    好吧,没注意这是python节点,请忽略我上面的评论。。
    ipconfiger
        7
    ipconfiger  
       2015-04-23 11:43:29 +08:00
    @ob 6w行还需要动hadoop?
    python读进来,"\n".join(list(set(f.readlines()))) 写回去就好了
    youxiaer
        8
    youxiaer  
       2015-04-23 11:52:45 +08:00
    如果不考虑原有顺序就比较简单了。
    for i in `find ./ -name "*.txt"`; do sort $i | uniq > $i".bak"; mv $i".bak" $i; done
    staticor
        9
    staticor  
       2015-04-23 11:53:35 +08:00   ❤️ 1
    考虑顺序?
    如果不考虑的话是用set() : uniqlines = set(open('/tmp/foo').readlines())
    *Nix下sort <file name> | uniq

    也有用dict的keys()的:

    import collections

    with open(infile, 'rb') as inf, open(outfile, 'wb') as outf:
    outf.writelines(collections.OrderedDict.fromkeys(inf))


    -----------------------------------------

    要保持原顺序, 那就算一行一行读也能操作:
    for ...
    if line not in ... :
    read_it



    注: 我只是ST搬运工.
    holinhot
        10
    holinhot  
    OP
       2015-04-23 12:04:34 +08:00
    @staticor
    @youxiaer 顺序都不保持也可以。到时候导入数据库就好了
    刚测试了一个 没有问题,现在还在执行中 感谢了 我自己查了半天 uniq还没看明白
    youxiaer
        11
    youxiaer  
       2015-04-23 12:07:35 +08:00   ❤️ 2
    @holinhot 保证顺序也是可以的。
    for i in `find ./ -name "*.txt"`; do awk '!a[$0]++' $i > $i".bak"; mv $i".bak" $i; done

    用上面的语句就行
    kimmykuang
        12
    kimmykuang  
       2015-04-23 14:27:24 +08:00
    sort + uniq命令可以搞定的吧?
    GreenJoson
        13
    GreenJoson  
       2015-04-23 14:30:09 +08:00
    Emeditor 打开10多W万行的文本都不成问题,删除重复行用他的插件~~瞬间的事~~
    atan
        14
    atan  
       2015-04-23 14:32:28 +08:00
    sublime text 打开后 Edit>Permute Lines>Unique
    xiaoheshang
        15
    xiaoheshang  
       2015-04-23 14:50:45 +08:00   ❤️ 1
    直接sort |uniq -c |sort -r 解决
    duzhe0
        16
    duzhe0  
       2015-04-23 14:59:44 +08:00
    感觉你是想做个diff,把逻辑上相同的行批掉就行了
    mv aaaa.com.log aaaa.com.log.backup
    sed -i 's/^aaaa.com/123.com/;s/ns1.youdns.com. dns.youdns.com/ns1.dns.com. dns.dns.com./' aaaa.com.log
    diff 123.com.log aaaa.com.log
    duzhe0
        17
    duzhe0  
       2015-04-23 15:00:55 +08:00
    弄错了, 不是mv, 是cp
    jianghu52
        18
    jianghu52  
       2015-04-23 15:06:22 +08:00
    up @GreenJoson 的做法,emeditor打开大文件绝对飞快。
    IssacTseng
        19
    IssacTseng  
       2015-04-23 15:10:44 +08:00   ❤️ 2
    全部复制到excel,全选6W行数据
    数据选项卡-数据工具栏目“删除重复数据”
    cbsw
        20
    cbsw  
       2015-04-23 15:29:12 +08:00
    不要拘泥于工具,Python只是一种方便的编程语言而已,sort、unique两个命令干这事最合适了

    Do the right thing with the right tool, never try to do everything with one tool.
    holinhot
        21
    holinhot  
    OP
       2015-04-23 15:37:15 +08:00
    @prinzchao 这个厉害 你手动从6w txt复制到excel?
    chengzhoukun
        22
    chengzhoukun  
       2015-04-23 15:38:45 +08:00 via Android
    用SQL也可以吧
    chengzhoukun
        23
    chengzhoukun  
       2015-04-23 15:38:45 +08:00 via Android
    用SQL
    holinhot
        24
    holinhot  
    OP
       2015-04-23 15:39:30 +08:00
    @GreenJoson 不是10w行吧。是6w个txt 每个txt大概10来行
    holinhot
        25
    holinhot  
    OP
       2015-04-23 15:41:24 +08:00
    @chengzhoukun 最终用api入库
    MarioLuisGarcia
        26
    MarioLuisGarcia  
       2015-04-23 15:43:18 +08:00   ❤️ 1
    vim里 :sort u
    搞定!
    tikazyq
        27
    tikazyq  
       2015-04-23 15:44:50 +08:00
    cat <filename> | sort | uniq >> unique.txt

    6万行数据不算大,直接unix操作就ok
    IssacTseng
        28
    IssacTseng  
       2015-04-23 16:20:31 +08:00
    @holinhot 临时处理某个文档数据当然可以这样啊,6W行数据对现在的电脑配置来说毫无难度吧。
    Anybfans
        29
    Anybfans  
       2015-04-23 16:33:46 +08:00
    为什么大家看不清。。。人家说的是6个txt文件。。。。。。。。。
    sbboy
        30
    sbboy  
       2015-04-23 16:51:49 +08:00
    @Anybfans 6万个吧。。。
    touch
        31
    touch  
       2015-04-23 16:57:41 +08:00
    既然最终要入库的那不是一条sql语句的事
    raman
        32
    raman  
       2015-04-23 17:14:07 +08:00
    这里 sort - u file.txt
    idblife
        33
    idblife  
       2015-04-23 17:17:06 +08:00
    导入数据库里操作一下
    anexplore
        34
    anexplore  
       2015-04-23 17:20:18 +08:00
    sort -u src.txt > des.txt 就可以搞定了...
    iiilii
        36
    iiilii  
       2015-04-23 17:58:25 +08:00
    这么多人都没看懂楼主的问题,6万个txt文件,每个文件10几行。
    incompatible
        37
    incompatible  
       2015-04-23 18:00:04 +08:00
    python里没有 既能保持添加顺序、又能滤重 的数据结构?
    类似Java里的LinkedHashSet
    staticor
        38
    staticor  
       2015-04-23 18:25:35 +08:00
    @incompatible ordereddict collections中的
    mucid
        39
    mucid  
       2015-04-23 18:48:43 +08:00
    cat *.txt | sort | uniq > all.txt
    Jaylee
        40
    Jaylee  
       2015-04-23 19:02:56 +08:00
    @mucid sort -u 就可以
    USCONAN
        41
    USCONAN  
       2015-04-23 19:05:10 +08:00
    sort uniq

    P.S. 論起標題的嚴謹性和歧義的產生
    leavic
        42
    leavic  
       2015-04-23 19:22:02 +08:00
    sort|uniq

    done
    shierji
        43
    shierji  
       2015-04-23 19:34:14 +08:00
    python cookbook里面有介绍保持顺序的去重方法
    carmark
        44
    carmark  
       2015-04-23 19:40:01 +08:00
    bloom filter 值得研究
    用这个工具处理500g数据都没问题,当然有一定错误率
    GreenJoson
        45
    GreenJoson  
       2015-04-23 20:22:51 +08:00
    @holinhot 把6W多个合并成一个,然后用emeditor 就行~~
    KoleHank
        46
    KoleHank  
       2015-04-23 21:03:09 +08:00
    每一行读出来了往redis里面一塞可行不?
    rrfeng
        47
    rrfeng  
       2015-04-23 21:09:02 +08:00   ❤️ 1
    不需要保证输出顺序的话:

    awk '!a[$0}++' file1 > file1_output

    如果要合并去重的话
    awk '!a[$0]++' file1 file2 file3.... fileN > all_output


    ----------
    一个合格的运维从来不用 sort -u 23333
    LuciferSheng
        48
    LuciferSheng  
       2015-04-23 22:55:22 +08:00
    果然都是程序员,我的方法是导入到 excel - 删除重复项...
    withboost
        49
    withboost  
       2015-04-23 22:55:29 +08:00
    第一反映是用 excel
    ShunYea
        50
    ShunYea  
       2015-04-23 23:13:44 +08:00
    @LuciferSheng 我想到的第一个方法也是这个。
    zts1993
        51
    zts1993  
       2015-04-23 23:23:54 +08:00 via Android
    为什么没人用redis
    Battle
        52
    Battle  
       2015-04-24 01:21:05 +08:00 via iPad
    那么多用编程解决的都编得定势思维了?用个excel一下子就行
    geeti
        53
    geeti  
       2015-04-24 02:52:15 +08:00
    cat|uniq > xx不就行了。。。。
    20150517
        54
    20150517  
       2015-04-24 03:58:57 +08:00
    来说个上T的情况怎么处理的办法,把这个弄进hdfs,开hive,来个row_number函数partition by重复的列,几T数据也帮你处理下来
    ryd994
        55
    ryd994  
       2015-04-24 07:16:08 +08:00 via Android
    @geeti uniq前须先sort
    @Battle bash cat sort uniq打字10秒顶天了
    唯一怕内存不够。不过如果内存不够的话,excel也一样,就只能上数据库了。
    ibolee
        56
    ibolee  
       2015-04-24 09:31:51 +08:00
    导入excle中滤重可能不?备份下试试。
    s51431980
        57
    s51431980  
       2015-04-24 09:37:57 +08:00
    ls *.txt | xargs -I{} bash -c "sort -u {} > {}.bak ; mv {}.bak {}"
    hicdn
        58
    hicdn  
       2015-04-24 10:18:28 +08:00
    awk '!a[$0]++' *.txt > new
    lzg
        59
    lzg  
       2015-04-24 10:33:40 +08:00
    你这个TXT应该是从SQL中导出的吧。在SQL中就很好做了。
    你直接Select distinct再导出TXT。
    holinhot
        60
    holinhot  
    OP
       2015-04-24 12:24:16 +08:00
    @touch 不去重用api不行
    holinhot
        61
    holinhot  
    OP
       2015-04-24 12:24:34 +08:00
    @lzg dig遍历的
    holinhot
        62
    holinhot  
    OP
       2015-04-24 12:25:14 +08:00
    @carmark 有错误是不能被接受的 后期检查不完蛋了
    holinhot
        63
    holinhot  
    OP
       2015-04-24 12:25:49 +08:00
    @prinzchao 还是你厉害
    carmark
        64
    carmark  
       2015-04-24 16:27:35 +08:00
    @holinhot 所以说就看你的需求了,当然目前的情况是你的数据少,如果数据达到500g,你想过时间是多少么,所以为了时间而抛弃正确率
    Mr1028
        65
    Mr1028  
       2015-04-24 16:45:46 +08:00
    @holinhot 哈哈哈,手速一定要够快
    Mr1028
        66
    Mr1028  
       2015-04-24 16:48:18 +08:00
    @hicdn 终于看到 awk 了。。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1096 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 19:41 · PVG 03:41 · LAX 11:41 · JFK 14:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.