对大文件中的行进行重复数据删除

对大文件中的行进行重复数据删除

文件大小为 962,120,335 字节。

HP-UX ******B.11.31 U ia64 ****** 无限用户许可证

hostname> what /usr/bin/awk
/usr/bin/awk:
         main.c $Date: 2009/02/17 15:25:17 $Revision: r11.31/1 PATCH_11.31 (PHCO_36132)
         run.c $Date: 2009/02/17 15:25:20 $Revision: r11.31/1 PATCH_11.31 (PHCO_36132)
         $Revision: @(#) awk R11.31_BL2010_0503_1 PATCH_11.31 PHCO_40052
hostname> what /usr/bin/sed
/usr/bin/sed:
         sed0.c $Date: 2008/04/23 11:11:11 $Revision: r11.31/1 PATCH_11.31 (PHCO_38263)
         $Revision: @(#) sed R11.31_BL2008_1022_2 PATCH_11.31 PHCO_38263
 hostname>perl -v
    This is perl, v5.8.8 built for IA64.ARCHREV_0-thread-multi
hostname:> $ file /usr/bin/perl
/usr/bin/perl:  ELF-32 executable object file - IA64
hostname:> $ file /usr/bin/awk
/usr/bin/awk:   ELF-32 executable object file - IA64
hostname:> $ file /usr/bin/sed
/usr/bin/sed:   ELF-32 executable object file - IA64

这里没有 GNU 工具。
我有什么选择?

如何删除大型多 GB 文本文件中的重复行?

http://en.wikipedia.org/wiki/External_sorting#External_merge_sort

perl -ne 'print unless $seen{$_}++;' < file.merge > file.unique

投掷

Out of Memory!

960MB 的结果文件由下列大小的文件合并而成,平均值为 50 MB 22900038、24313871、25609082、18059622、23678631、32136363、49294631、61348150、85237944、 2586、79842339、72655093、73474145、82539534、65101428、 57240031、79481673、539293、38175881

问题:如何执行外部排序合并和重复数据删除?或者说,如何删除这些数据的重复数据?

答案1

在我看来,您目前正在遵循的流程是这样的,该流程因内存不足错误而失败:

  1. 创建多个数据文件
  2. 将它们连接在一起
  3. 对结果进行排序,丢弃重复的记录(行)

我认为你应该能够执行以下过程

  1. 创建多个数据文件
  2. 独立对每一项进行排序,丢弃其重复项 ( sort -u)
  3. 合并排序后的数据文件的结果集,丢弃重复项 ( sort -m -u)

答案2

当然没有 GNU/Linux 工具:什么是源代码控制系统 (SCCS) 的一部分,我认为 Linux 中根本不存在该系统。

所以,大概您使用的是 Unix。那里有种类算法能够处理这些问题:UNIX Sort 命令的算法细节指出大小的输入中号,具有大小的内存, 又分为月/日适合内存的块,并且是连续处理的。

它应该符合要求。

答案3

% perl -ne 'if ( $seen{$_}++ ) {
    $count++ ;
    if ($count > 1000000) {
        $seen = () ;
        $count = 0 ;
    }
} else {
    print ;
}' <eof   
a
a
a
b
c
a
a
a
b
c
eof   
a
b
c
%

相关内容