文件大小为 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 工具。
我有什么选择?
和
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
在我看来,您目前正在遵循的流程是这样的,该流程因内存不足错误而失败:
- 创建多个数据文件
- 将它们连接在一起
- 对结果进行排序,丢弃重复的记录(行)
我认为你应该能够执行以下过程
- 创建多个数据文件
- 独立对每一项进行排序,丢弃其重复项 (
sort -u
) - 合并排序后的数据文件的结果集,丢弃重复项 (
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
%