Chinaunix
标题:
如何将两个文本文件中相同行删除
[打印本页]
作者:
stray_eagle
时间:
2013-06-08 22:16
标题:
如何将两个文本文件中相同行删除
初学perl,在实际运用中遇见一个问题,使用了hash,却没能解决掉,概述如下,请各位大虾帮忙解决下,3Q!
示例文件内容如下:
a.txt
parameter1,value1
parameter2,value2
parameter3,value3
parameter3,value9
parameter4,value4
parameter5,value5
parameter5,value6
b.txt
parameter2
parameter5
想将凡是在b.txt文件中的内容,在a.txt中删除(删除a.txt的整行),得到c.txt文件,内容如下:
parameter1,value1
parameter3,value3
parameter3,value9
parameter4,value4
请各位大虾帮忙。
作者:
kiwivip
时间:
2013-06-09 09:15
cat a.txt b.txt |sort|uniq -u > c.txt
作者:
stray_eagle
时间:
2013-06-09 10:02
cat a 和b,这个是合并了
作者:
lhohoz
时间:
2013-06-09 10:06
#!/usr/bin/perl
use warnings;
my %hash;
open(ONE, "1.txt") || die "can't open : $!";
while ($line = <ONE>) {
($key, $value) = split /,/ , $line;
push ( @{$hash{$key}}, $value );
}
open(TWO, "2.txt") || die "can't open : $!";
while (<TWO>) {
chomp;
push (@new, $_) if exists $hash{$_};
}
delete $hash{$_} for @new;
foreach $key (sort keys %hash) {
foreach $para (sort @{$hash{$key}}) {
print "$key, $para";
}
}
复制代码
perl 文件名.pl>c.txt
作者:
b114213903
时间:
2013-06-09 10:23
回复
1#
stray_eagle
#!/usr/bin/perl
use strict;
my %hash;
open (B,"<b.txt") or die "Open b.txt error:\t$!\n";
while (<B>){
chomp;
if($_){
$hash{$_}=1;
}
}
close B;
open (A,"<a.txt") or die "Open a.txt error:\t$!\n";
open (C,">c.txt") or die "Open c.txt error:\t$!\m";
while (<A>){
chomp;
my ($key,$value)=split (/\W/,$_);
if($hash{$key}){
next
}else{
print C "$_\n";
}
}
close C;
close A;
复制代码
作者:
mcshell
时间:
2013-06-09 10:49
回复
1#
stray_eagle
perl -lne 'chomp;if($ARGV eq "b"){$h{$_}++;next};/([^,]+)(?{print $_ unless $h{$1}})/' b a
复制代码
{:3_186:}
作者:
stray_eagle
时间:
2013-06-09 11:11
感谢大家的帮助,我都好好看下大家的代码。
今早改变了下思路,将b.txt文件增加了第二列记录,要不使用hash老是打印一个完整的a.txt信息,得不到自己想要的,修改如下:
a.txt
key1,1
key3,3
key2,2
key4,4
b.txt
key1,1
key2,2
#!/usr/bin/perl
use strict;
use warnings;
use Data:
umper;
my $FILE1=`cat a.txt`;
my $FILE2=`cat b.txt`;
my @array1 = split /\n/, $FILE1;
my @array2 = split /\n/, $FILE2;
my (%m, %n);
foreach ( @array1, @array2 ) {
$m{$_}++ and $n{$_}++;
}
print "\n相同记录信息如下:\n";
print "$_\n" for grep { $m{$_} >= 2 } keys %m;
运行结果如下:
>perl test.pl
相同记录信息如下:
key1,1
key2,2
作者:
stray_eagle
时间:
2013-06-09 11:18
如果得到不相同的,
print "$_\n" for grep { $m{$_} == 1 } keys %m;
作者:
skles
时间:
2013-06-10 10:01
如果你是linux上运行。何必那么麻烦,针对你这个问题:
# cat a.txt
parameter1.value1
parameter2.value2
parameter3.value3
parameter3.value9
parameter4.value4
parameter5.value5
parameter5.value6
# cat b.txt
parameter2
parameter5
# egrep -vf b.txt a.txt
parameter1.value1
parameter3.value3
parameter3.value9
parameter4.value4
作者:
rubyish
时间:
2013-06-10 11:15
这个 ~
open my $A, 'a.txt';
open my $B, 'b.txt';
open my $C, '>', 'c.txt';
my %h = map { chomp; $_, 1 } <$B>;
@h{/(\w+\d+)/} or print $C $_ while <$A>;
复制代码
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2