-1

我需要比较两个文件。在第一个文件中,我有一些 ID 对,在第二个文件中,我有以两种样式(每列一个)编写的 ID 列表。它们看起来像这样:

文件 1

IDnew_1 IDnew_2
IDnew_3 IDnew_4
IDnew_5 IDnew_6
IDnew_7 IDnew_8

文件 2

IDnew_1 IDold_1
IDnew_2 IDold_2
IDnew_7 IDold_7
IDnew_8 IDold_8

我想获得这样的输出:

IDold_1 IDold_2
IDold_7 IDold_8

实际上,我需要在文件 2 中的“旧样式 ID”中“翻译”文件 1。我尝试了一些东西perl,但我无法使用文件 2 中的两列。我的 perl 代码如下所示:

$file_GS = "file1.txt";
$file_orto = "file2.txt";
open (HAN, "< $file_orto") || die "Impossible open input orto";
@r = <HAN>;
close (HAN);
open (GAS, "< $file_GS") || die "Immposible open GS file";
@p = <GAS>;
close (GAS);

for ($i=0; $i<=$#r; $i++){
chomp ($r[$i]);
@orto = split ( /\t/, $r[$i]);
$old = $orto[0];
$new = $orto[1];

for ($l=0; $l<=$#p; $l++){
chomp ($p[$l]);
@v = split (/\t/, $p[$l]);
$gs1 = $v[0];
$gs2 = $v[1];

if ($gs1 eq pf_old){
print "$pb\n";
}
}
}

此代码仅写入一列,输出如下所示:

IDold_1
IDold_7

....我怎样才能让它工作给我两列输出?建议?
谢谢!!

4

2 回答 2

2

你必须给出一个更好的解释你想要什么。

我的假设是您想使用 File #2 作为查找表。也就是说,您在文件 #1 中有一个新 ID,您需要将其转换为在文件 #2 中找到的旧 ID。这个对吗?如果文件#1 中的一行在#1 列中具有可转换ID,但在#2 列中没有,该怎么办?你想要什么?

在这种情况下,您需要先读取文件 #2,然后将新 ID(密钥)转换为旧 ID(数据)的哈希值。

#! /usr/bin/env perl

use strict;
use warnings;
use feature qw(say);
use autodie;

use constant {
    FILE_1    => "file1.txt",
    FILE_2    => "file2.txt",
};

# Read in File 2 and create a look up table
open my $file2_fh, "<", FILE_2;
my %lookup_table;

while ( my $line = <$file2_fh> ) {
    chomp $line;
    my ($new_id, $old_id) = split /\s+/, $line;
    $lookup_table{ $new_id } = $old_id;
}
close $file2_fh;

现在您有了一个查找表,您可以轻松地将新 ID 转换为旧 ID。让我们通过文件#1

open my $file1_fh, "<", FILE_1;
while ( my $line = <$file1_fh> ) {
    chomp $line;
    my ($new_id_1, $new_id_2 ) = split /\s+/, $line;

    my ( $old_id_1, $old_id_2 );

    if ( exists $lookup_table{ $new_id_1 } ) {
       $old_id_1 = $lookup_table{ $new_id_1 };
    }

    if ( exists $lookup_table{ $new_id_2 } ) {
       $old_id_2 = $lookup_table{ $new_id_2 };
    }

    # Now you've got to decide what to do here...

    # First column is defined and second column isn't
    if    ( defined $old_id_1 and not defined $old_id_2 ) {
        say "Here be dragons...";
    }
    # Second column is defined and first column isn't
    elsif ( not defined $old_id_1 and defined $old_id_2 ) {
        say "Here be dragons...";
    }
    # Both columns are defined
    elsif ( defined $old_id_1 and defined $old_id_2 ) {
        say "$old_id_1   $old_id_2";
    }
}
close $file1_fh;
于 2013-05-31T11:55:46.310 回答
0

首先,散列“翻译”文件。然后只打印找到两个 id 的翻译的那些行。

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

my $file_gs   = 'file1.txt';
my $file_orto = 'file2.txt';

my %translate;
open my $ORTO, '<', $file_orto or die $!;
while (<$ORTO>) {
    my ($new, $old) = split;
    die "Duplicate $old" if exists $translate{$old};
    $translate{$new} = $old;
}

open my $GS, '<', $file_gs or die $!;
while (<$GS>) {
    my @ids = grep defined, map $translate{$_}, split;
    print "@ids\n" if 2 == @ids;
}
于 2013-06-06T16:10:14.713 回答