【问题标题】:Compare files and write matching and not matching things比较文件并写入匹配和不匹配的东西
【发布时间】:2013-06-06 14:07:38
【问题描述】:

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

第一个报告带有一些 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 进行比较。如果有匹配项,我想打印相应的 name(例如,对于文件 1 中的 *ID_3*,我想在输出中打印 name3),如果有不匹配 我想从文件 1 qith “未找到”打印不匹配的 ID。例如对于 *ID_38*(在文件 2 中没有匹配项),我想打印 *ID_38 not-found*。

我写了一个 perl 脚本,它能够正确地编写与匹配 ID 对应的 names,但它不能很好地编写不匹配的 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

【问题讨论】:

    标签: perl


    【解决方案1】:

    我会使用哈希来记住哪个 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";
    }
    

    【讨论】:

    • ...还有一个问题:如果输入列表有两列呢?
    • @Gabelins:那么第二列是什么?
    • 第二列,长度与第一列相同,带有 ID。 Like(分隔行的逗号):ID_3 ID_3-2、ID_6 ID_5、ID_5-2 ID_2-2、ID_38 ID_1。对于有匹配 ID 和不匹配 ID 的行,我不想要任何输出。
    • @Gabelins:您可能应该发布一个包含完整规范的新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 2019-06-24
    • 2021-06-15
    • 1970-01-01
    相关资源
    最近更新 更多