Board logo

标题: [文本处理] 批处理如何快速删除大文本文件里面的多余重复行(重复行只保留一行)? [打印本页]

作者: cm535    时间: 2011-7-26 10:36     标题: 批处理如何快速删除大文本文件里面的多余重复行(重复行只保留一行)?

本帖最后由 pcl_test 于 2016-11-3 16:49 编辑

有a.TXT, 大小为280M,里面有2800万行的数字或者字母或者特殊符号,
每行最多有12个字符,最少有8个字符!其中有很多重复行。

我想删除重复行中的一行,保留另一行。简单说就是二行留一行。

内容举例如下:
aaaaaaaaaaaa
bbbbbbbb
=+*&^%#$@/
ddddddddd
aaaaaaaaaaaa
ddddddddd
eeeeeeee
,.qdp{}?#&=
@#$!()[]-=@
gggggggg
hhhhhhhhh

显然
aaaaaaaaaaaaddddddddd,这2行出现了2次重复,处理后相同的行只保留其一,
其它的行不处理,保留。
将处理后的结果放在B.txt里面。
结果如下:
aaaaaaaaaaaa
bbbbbbbb
=+*&^%#$@/
ddddddddd
eeeeeeee
,.qdp{}?#&=
@#$!()[]-=@
gggggggg
hhhhhhhhh

我试过很多批处理都不行,包括本站搜索得来的批处理,要么速度非常非常慢,无法忍受。
要么无法运行,黑窗口、b.txt为0字节。

还试过很多软件,
【如(Replace Pioneer),文件太大,打不开。】,
【(UltraEdit),排序时提示错误。】,
【(TXT 重复行删除工具 v1.1.exe),运行后半个小时无响应】,
【(文本重复去除器.exe),提示:请稍等,正在去重复。运行了12个小时后,我看到,
2800W行,只对比了10W多行。运行十天也对比不完啊】。

我这个280M的大文件是把很多txt小文件合并得来的,在合并之前,有没有什么方法比对这些小的txt文件中间
有没有重复行并删一行留一行呢?
反正用什么方法都可以!分割、比对、合并,其它软件(使用方法),只要达到目的就行!!!

怎么办啊!!! 请各位老大,各位高手 斑竹 显身 吧!!!
作者: asnahu    时间: 2011-7-26 12:07

本帖最后由 asnahu 于 2011-7-26 12:09 编辑

replace pioneer是基于PERL的啊,如果直接用PERL不是更好?另外,也可以用awk处理:
  1. gawk "!a[$0]++" FILE
复制代码
  1. awk '!a[$0]++'
复制代码
This one-liner is very idiomatic. It registers the lines seen in the associative-array “a” (arrays are always associative in Awk) and at the same time tests if it had seen the line before. If it had seen the line before, then a[line] > 0 and !a[line] == 0. Any expression that evaluates to false is a no-op, and any expression that evals to true is equal to “{ print }”.

For example, suppose the input is:
  1. foo
  2. bar
  3. foo
  4. baz
复制代码
When Awk sees the first “foo”, it evaluates the expression “!a["foo"]++”. “a["foo"]” is false, but “!a["foo"]” is true - Awk prints out “foo”. Then it increments “a["foo"]” by one with “++” post-increment operator. Array “a” now contains one value “a["foo"] == 1″.

Next Awk sees “bar”, it does exactly the same what it did to “foo” and prints out “bar”. Array “a” now contains two values “a["foo"] == 1″ and “a["bar"] == 1″.

Now Awk sees the second “foo”. This time “a["foo"]” is true, “!a["foo"]” is false and Awk does not print anything! Array “a” still contains two values
“a["foo"] == 2″ and “a["bar"] == 1″.

Finally Awk sees “baz” and prints it out because “!a["baz"]” is true. Array “a” now contains three values “a["foo"] == 2″ and “a["bar"] == 1″ and “a["baz"] == 1″.

The output:
  1. foo
  2. bar
  3. baz
复制代码
Here is another one-liner to do the same. Eric in his one-liners says it’s the most efficient way to do it.
  1. awk '!($0 in a) { a[$0]; print }'
复制代码
It’s basically the same as previous one, except that it uses the ‘in’ operator. Given an array “a”, an expression “foo in a” tests if variable “foo” is in “a”.

Note that an empty statement “a[$0]” creates an element in the array.

可以从这里下载:http://unxutils.sourceforge.net/
作者: cm535    时间: 2011-7-26 12:12

老大,俺看不懂啊!,四个代码各是什么意思啊?请详细告知为盼!!!多谢多谢!
作者: asnahu    时间: 2011-7-26 12:18

系统要有gawk啊,下面就是解释嘛,哪里看不懂?
作者: cm535    时间: 2011-7-26 13:15

本帖最后由 cm535 于 2011-7-26 13:21 编辑

我的系统里有gawk.exe,请问你给的这个代码我怎么用。
  1. gawk "!a[$0]++" FILE
复制代码
我的文件名是a.txt,重新生成的文件名是b.txt。

请老大发中文,好吗?英文看不懂啊!

你给的批处理和 a.txt,我放在了d:\下,运行后迅速关闭了,无反应!

请问,你给的5个代码我都可以用吗?我怎么看不懂啊!

即没有源文件名,也没有新产生的文件名,我怎么用啊?请教请教!

多谢多谢!!!
作者: asnahu    时间: 2011-7-26 13:19

  1. gawk "!a[$0]++"<a.txt>b.txt
复制代码
看这样行不行
作者: wrz99    时间: 2011-7-26 13:38

用全能字符串替换机
试试看,但是要自已设置规则!
作者: cm535    时间: 2011-7-26 15:16

asnahu老大,我试了一下,处理30M文件很快,280M的现在还在处理,将近2小时了,还没有结束,
不知得多长时间?先谢谢了!!!
作者: asnahu    时间: 2011-7-26 17:22

awk处理行是非常快的了
作者: CUer    时间: 2011-7-26 23:36

回复 8# cm535


试试Perl速度如何?
http://bbs.bathome.net/thread-12675-1-1.html
作者: cm535    时间: 2011-7-27 12:09

七楼的老大,全能字符串替换机我已经下下来试过了,昨晚运行了一夜,早上起来看,还是像不响应的样子,没有任何变化,也没有提示!可能是文件太大了!
作者: cm535    时间: 2011-7-27 12:18

asnahu老大,我用你的(gawk "!a[$0]++"<a.txt>b.txt)这个代码,运行了7个小时,得到了b.txt!
可我现在有个疑问,我原来的a.txt,大小为280M,删除重复行后,b.txt的大小变成了198M。我总觉得有问题,我的重复行也不至于有接近100M要删除啊!批处理在运行时,因为没有如何提示,看也看不出来,纠结啊!!!
作者: applba    时间: 2011-7-27 12:47

有些字符可能删除了,比如行首空格,空白行……
作者: asnahu    时间: 2011-7-27 20:13

回复 12# cm535

我2楼的回答里不是有更加高效的方法了吗,要认真看啊
作者: asnahu    时间: 2011-7-27 20:22

本帖最后由 asnahu 于 2011-7-27 20:26 编辑

我这没法测试处理这么大的文件到底需要多长时间,需要注意的是机器的硬件环境是很重要的。
作者: CUer    时间: 2011-7-30 23:20

回复 12# cm535


Perl的效果如何,试了没?




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2