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

2015-04-23 11:34:09 +08:00
 holinhot

文本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记录 真是奇怪

9513 次点击
所在节点    Python
66 条回复
holinhot
2015-04-23 11:35:41 +08:00
不能说固定删除第几行,这个行不通 因为每个域名的解析记录条数有多有少
magicianzrh
2015-04-23 11:37:17 +08:00
每读入一行 一行文字md5一下作为key,就可以检查了
ksupertu
2015-04-23 11:38:28 +08:00
uniq命令加管道重定向输出文件
airqj
2015-04-23 11:38:59 +08:00
sort -u
ob
2015-04-23 11:40:40 +08:00
话说搭个hadoop环境是否可行。。
ob
2015-04-23 11:41:59 +08:00
好吧,没注意这是python节点,请忽略我上面的评论。。
ipconfiger
2015-04-23 11:43:29 +08:00
@ob 6w行还需要动hadoop?
python读进来,"\n".join(list(set(f.readlines()))) 写回去就好了
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
2015-04-23 11:53:35 +08:00
考虑顺序?
如果不考虑的话是用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
2015-04-23 12:04:34 +08:00
@staticor
@youxiaer 顺序都不保持也可以。到时候导入数据库就好了
刚测试了一个 没有问题,现在还在执行中 感谢了 我自己查了半天 uniq还没看明白
youxiaer
2015-04-23 12:07:35 +08:00
@holinhot 保证顺序也是可以的。
for i in `find ./ -name "*.txt"`; do awk '!a[$0]++' $i > $i".bak"; mv $i".bak" $i; done

用上面的语句就行
kimmykuang
2015-04-23 14:27:24 +08:00
sort + uniq命令可以搞定的吧?
GreenJoson
2015-04-23 14:30:09 +08:00
Emeditor 打开10多W万行的文本都不成问题,删除重复行用他的插件~~瞬间的事~~
atan
2015-04-23 14:32:28 +08:00
sublime text 打开后 Edit>Permute Lines>Unique
xiaoheshang
2015-04-23 14:50:45 +08:00
直接sort |uniq -c |sort -r 解决
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
2015-04-23 15:00:55 +08:00
弄错了, 不是mv, 是cp
jianghu52
2015-04-23 15:06:22 +08:00
up @GreenJoson 的做法,emeditor打开大文件绝对飞快。
IssacTseng
2015-04-23 15:10:44 +08:00
全部复制到excel,全选6W行数据
数据选项卡-数据工具栏目“删除重复数据”
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.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/185684

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX