2011-03-03 47 views
0

我有2个文件。如何从两个文本文件保留唯一的行,丢弃重复项?

例如,文件#1的内容是:

hi1 
hi2 
hi4 

...的文件#2:

hi1 
hi4 
hi3 
hi5 

我想整理一下这些文件,使第三个文件会包含只是:

hi2 
hi3 
hi5 

任何人都可以在正确的方向折腾吗?我迫切需要!需要Perl,但接受C/C++。

+0

为什么不'hi2'呢? – 2011-03-03 02:58:23

+0

对不起,我在校对时发现了这个,谢谢你的通知。 – 2011-03-03 02:58:59

回答

2

这里有一小段代码来做你想做的事情。没有错误检查,我假设你的文本文件不是很大,以至于你将所有文本加载到散列数组中,从而导致内存不足。

open(FILE1, "< file1.txt"); 
open(FILE2, "< file2.txt"); 

@file1 = <FILE1>; 
@file2 = <FILE2>; 

foreach $line (@file1, @file2) 
{ 
    chomp($line); 
    $TEXT{$line}++; 
} 

foreach $line (sort keys %TEXT) 
{ 
    if ($TEXT{$line} == 1) 
    { 
     print $line . "\n"; 
    } 
} 
+0

这是沿着我想要的路线;然而输出是这样的:hi2 hi3 hi4hi4 hi5 – 2011-03-03 03:37:29

+0

啊,那么我们需要剥离EOL并将其放回底部。我会纠正这个咒语。 – darklion 2011-03-03 03:47:12

+0

完美!谢谢,快速反应! – 2011-03-03 04:04:04

-1

仍然不确定是否完全描述了问题。 hi3不重复,但hi4是。所以应该输出包含hi3而不是hi4?提示:要在Perl中检测重复项,您可能需要使用散列。

+0

对不起,我在一个网站... – 2011-03-03 03:33:19

5

我知道你问的Perl或C,但在UNIX(或MKS或同等的Unix在Windows工具包):

sort file1 file2 | uniq -u > file3 

它没有什么比这更简单。

0

计数每行,然后打印出的人在计数为1:

#!/usr/bin/perl 
use warnings; 
use strict; 

local @ARGV = ('file.1', 'file.2'); 
my %lines; 
while (<>) { 
    $lines{$_}++; 
} 

print sort grep $lines{$_} == 1, keys %lines; 
相关问题