Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1308654
  • 博文数量: 213
  • 博客积分: 7590
  • 博客等级: 少将
  • 技术积分: 2185
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-31 17:31
个人简介

热爱开源,热爱linux

文章分类

全部博文(213)

文章存档

2018年(4)

2017年(1)

2015年(1)

2014年(5)

2013年(2)

2012年(2)

2011年(21)

2010年(82)

2009年(72)

2008年(23)

分类: Python/Ruby

2011-09-28 19:59:57

如果有一个文件data有10G大,但是有好多行都是重复的,需要将该文件中重复的行合并为一行,那么我们需要用什么办法来实现
cat data |sort|uniq > new_data #该方法可以实现,但是你需要花上好几个小时。结果才能出来。
下面是一个使用perl脚本来完成此功能的小工具。原理很简单,创建一个hash,每行的内容为键,值由每行出现的次数来填充,脚本如下;
  1. #!/usr/bin/perl
  2. # Author :CaoJiangfeng
  3. # Date:2011-09-28
  4. # Version :1.0
  5. use warnings;
  6. use strict;

  7. my %hash;
  8. my $script = $0; # Get the script name

  9. sub usage
  10. {
  11.         printf("Usage:\n");
  12.         printf("perl $script \n");

  13. }

  14. # If the number of parameters less than 2 ,exit the script
  15. if ( $#ARGV+1 < 2) {

  16.         &usage;
  17.         exit 0;
  18. }


  19. my $source_file = $ARGV[0]; #File need to remove duplicate rows
  20. my $dest_file = $ARGV[1]; # File after remove duplicates rows

  21. open (FILE,"<$source_file") or die "Cannot open file $!\n";
  22. open (SORTED,">$dest_file") or die "Cannot open file $!\n";

  23. while(defined (my $line = <FILE>))
  24. {
  25.         chomp($line);
  26.         $hash{$line} += 1;
  27.         # print "$line,$hash{$line}\n";
  28. }

  29. foreach my $k (keys %hash) {
  30.         print SORTED "$k,$hash{$k}\n";#改行打印出列和该列出现的次数到目标文件
  31. }
  32. close (FILE);
  33. close (SORTED);
阅读(6866) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~