Board logo

标题: [问题求助] [已解决]Perl删除重复行的时候如何不打乱原有顺序? [打印本页]

作者: CUer    时间: 2011-6-4 08:30     标题: [已解决]Perl删除重复行的时候如何不打乱原有顺序?

本帖最后由 CUer 于 2011-6-5 22:44 编辑

原文件a.txt:
  1. aaa
  2. bbb
  3. aaa
  4. aaa
  5. ccc
  6. ddd
  7. bbb
  8. ddd
复制代码
希望得到的b.txt:
  1. aaa
  2. bbb
  3. ccc
  4. ddd
复制代码
这个代码虽然可以删除重复行,但是把顺打乱了:
  1. use strict;
  2. use warnings;
  3. open(IN,"a.txt");
  4. my %list;
  5. while (<IN>) {
  6.     $list{$_}++;
  7. }
  8. close IN;
  9. open(OUT,">b.txt");
  10. foreach (keys %list) {
  11.     print OUT;
  12. }
  13. close OUT;
复制代码

作者: Batcher    时间: 2011-6-5 00:01

  1. use strict;
  2. use warnings;
  3. open(IN,"a.txt");
  4. open(OUT,">b.txt");
  5. my %hash = ();
  6. while (<IN>) {
  7.     if (!$hash{$_}) {
  8.         print OUT;
  9.         $hash{$_} = 1;
  10.     }
  11. }
  12. close IN;
  13. close OUT;
复制代码

作者: Batcher    时间: 2011-6-5 00:02

  1. perl -ane "if(++$a{$_}==1){print}" a.txt >b.txt
复制代码

作者: DAIC    时间: 2011-6-6 12:37

-ane是什么意思?
作者: Batcher    时间: 2011-6-6 21:35

4# DAIC


Perl命令行应用介绍
http://bbs.bathome.net/thread-12716-1-1.html
作者: sxw    时间: 2011-6-7 00:17

  1. use strict;
  2. use warnings;
  3. my %hash;
  4. while (<DATA>) {
  5.     if (!$hash{$_}) {
  6.         print;
  7.       $hash{$_} += 1;
  8.     }
  9. }
  10. __DATA__
  11. aaa
  12. bbb
  13. aaa
  14. aaa
  15. ccc
  16. ddd
  17. bbb
  18. ddd
复制代码
为什么结果是:
  1. aaa
  2. bbb
  3. ccc
  4. ddd
  5. ddd
复制代码
不知道什么原因?
作者: Batcher    时间: 2011-6-7 00:33

6# sxw


最后一行ddd行尾的空格删掉,下面在加一个空行即可。
作者: sxw    时间: 2011-6-7 09:58

7# Batcher
恩,还真是这样的。哈哈,版主我是这样理解的,表述不太好,不知道对不对:
(1) 【ddd】和【ddd+空格】 在$_看来是不同的,所以打印出来会出现2次ddd,其实他们不一样,第一次是【ddd】,第二次是【dd+空格】
(2)至于为什么要在最后一行ddd后加上另一行,是为了给其增加一个换行符,这样两处的ddd就完全一样了




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