比较文件和写匹配,不匹配的东西

时间:2013-06-06 14:07:38

标签: perl

我是编程方面的新手,需要很多帮助。我有两个文件:

第一个报告带有一些ID的列(实际上是列表),如下所示:

ID_3
ID_6
ID_5-2
ID_38

第二个文件报告一个包含多个列的表,如下所示:

name1 ID_1 ID_1-2
name2 ID_2 ID_2-2
name3 ID_3 ID_3-2 ID_3-3
name4 ID_4
name5 ID_5 ID_5-2
name6 ID_6

我的目标是将第一个文件中的每个ID与第二个文件中报告的ID进行比较。如果匹配,我想打印相应的名称(例如,对于文件1中的* ID_3 *我想在输出中打印 name3 ),如果有不匹配我想从文件1 qith“not-found”打印不匹配的ID。例如* ID_38 *(文件2中没有匹配项)我想打印* ID_38 not-found *。

我编写了一个perl脚本,能够正确编写与匹配ID相对应的名称,但是它无法以良好的方式编写不匹配的ID。 代码如下所示:

$file_table = "file_2.txt";
$file_list = "file1.txt";
open (HAN, "< $file_table") || die "Impossible open the table";
@r = <HAN>;
close (HAN);
open (PEW, "< $file_list") || die "Impossible open the list";
@l = <PEW>;
close (PEW);
for ($p=0; $p<=$#l; $p++) {
   chomp ($l[$p]);
   for ($i=0; $i<=$#r; $i++) {
     chomp ($r[$i]);
     @v = split (/ /, $r[$i]);
     for ($j=0; $j<=$#v; $j++) {
       chomp ($v[$j]);
       if ($l[$p] eq $v[$j]) {
         print "$v[0]\n";
       } else {
         print "$l[$p] not-found\n";
       }
     }
   }
}

我输错了,输出中有太多“未找到”的行,我不知道如何解决。我希望这样的输出:

name3
name6
name5
ID_38

1 个答案:

答案 0 :(得分:0)

我会使用哈希记住哪个ID对应于什么名称。

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

my $table  = 'file_2.txt';
my $column = 'file1.txt';

my %names;
open my $TAB, '<', $table or die $!;
while (<$TAB>) {
    my ($name, @ids) = split;
    push @{ $names{$_} }, $name for @ids;
}

open my $COL, '<', $column or die $!;
while (<$COL>) {
    chomp;
    print @{ $names{$_} // [$_] }, "\n";
}