2011-11-11 17 views
2

我有.txt文件与3列。我想比较第一列和第二列,如果第一列中的值出现在第二列中,我想删除第二列和第三列中的那个条目(不应修改第一列)。结果应该存储在一个新文件中。比较阵列值与散列和删除键,如果它匹配在一个文件

示例输入:

Col 1     Col 2    Col 3 
VIBHAR_02293_1 VIBHAR_00819_2  tatatattattata 
VIBHAR_00819_2 VIBHAR_00819_4  tattavgaggagag 
VIBHAR_00705_3 VIBHAR_00705_7  attaggaccaggat 
VIBHAR_00819_4 VIBHAR_02153_9  ccagggattattat 

输出示例:

VIBHAR_02293_1 VIBHAR_00705_7  attaggaccaggat 
VIBHAR_00819_2 VIBHAR_02153_9  ccagggattattat 
VIBHAR_00705_3 
VIBHAR_00819_4 

我使用以下代码尝试,但它不工作:

while($line=(<File>)) 
{ 
chomp($line); 
@F=split('\t',$line); 
    $hash{$F[1]}=$F[2]; 
    if ($F[0] eq $F[1]) 
    { 
#  print "$line\n"; 
     delete($hash{keys}); 
    } 
} 

如果列的格式,我张贴上面是不好的,只有我的问题就足够了,我猜。

+2

请不要泄露。 – SLaks

+0

你的换挡钥匙似乎有它自己的生活。 –

+1

我试着让你的例子正面或反面,直到我意识到第一列是完全独立的。似乎没有理由将它全部保存在一个文件中。如果将它们分成两个文件,很容易。如果你坚持保留一个文件,那么两遍aporoach似乎很自然;在第一遍中,读取第一列,并在第二遍中读取另外两个,丢弃在第一遍中也看到关键字段的任何条目。 – tripleee

回答

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

my %H; 
while (<>) { 
    chomp; 
    my @F = split /\t/; 
    $H{$F[0]} = [$., $F[1], $F[2]]; 
} 

my @col1; 
my @col23; 

for my $col1 (sort { $H{$a}[0] <=> $H{$b}[0] } keys %H) { 
    push @col1, $col1; 
    next if exists $H{ $H{$col1}[1] }; 
    push @col23, [@{ $H{$col1} }[1,2]]; 
} 

for my $i (0 .. $#col1) { 
    print $col1[$i]; 
    print "\t", join "\t", @{ $col23[$i] } if $i < @col23; 
    print "\n"; 
} 

你真的想“向上移动”第2列和第3列中的值吗?

+0

不,提高价值不是必要的,即时通讯尝试与我们的代码它juz显示整个文件本身 – Kiran

+0

@Kiran:奇怪,对我来说返回您的预期输出。 – choroba

+0

我似乎在做错误的仁慈检查DIS代码n正确的,如果有的话,相同的我复制粘贴juz编辑的打开文件n split..plz不介意还是im初学者特别是HASHES.open(File,'file.txt'); my%H; while(){ chomp; @ F = split('\ t',$ _); $ H {$ F [0]} = [$ _,$ F [1],$ F [2]]; } – Kiran

相关问题