perl - 将 FILE1 值与 FILE2 范围进行比较并打印匹配项

标签 perl

我对 Perl 非常陌生,正在大学从事生物信息学项目。我有 FILE1 包含职位列表,格式为:

99269
550
100
126477 
1700

FILE2 的格式为:

517 1878 forward
700 2500 forward
2156 3289 forward
99000 100000 forward
22000 23000 backward 

我想将 FILE1 中的每个位置与 FILE2 上值的每个范围进行比较,如果某个位置落入其中一个范围,那么我想打印位置、范围和方向。

所以我的预期输出是:

99269 99000 100000 forward
550 517 1878 forward
1700 517 1878 forward 

目前它运行时不会出现错误,但是它不会输出任何信息,所以我不确定我哪里出了问题!当我分割最终的“if”规则时,它会运行,但只有当位置与范围完全相同时才会起作用。

我的代码如下:

#!/usr/bin/perl

use strict;
use warnings;

my $outputfile = "/Users/edwardtickle/Documents/CC22CDS.txt";

open FILE1, "/Users/edwardtickle/Documents/CC22positions.txt"
    or die "cannot open > CC22: $!";

open FILE2, "/Users/edwardtickle/Documents/CDSpositions.txt"
    or die "cannot open > CDS: $!";

open( OUTPUTFILE, ">$outputfile" ) or die "Could not open output file: $! \n";

while (<FILE1>) {
    if (/^(\d+)/) {
        my $CC22 = $1;

        while (<FILE2>) {
            if (/^(\d+)\s+(\d+)\s+(\S+)/) {
                my $CDS1 = $1;
                my $CDS2 = $2;
                my $CDS3 = $3;

                if ( $CC22 > $CDS1 && $CC22 < $CDS2 ) {
                    print OUTPUTFILE "$CC22 $CDS1 $CDS2 $CDS3\n";
                }
            }
        }
    }
}

close(FILE1);
close(FILE2);

我已经发布了same question on Perlmonks .

最佳答案

因为只有当 FILE2 与 FILE1 的第一行进行比较时,您才读取 FILE2

后续行与关闭的文件进行比较

将 FILE1 中的行存储在数组中,然后将 FILE2 中的每一行与每个数组条目进行比较,如下所示

#!/usr/bin/perl

use strict;
use warnings;

my $outputfile = "out.txt";

open FILE1, "file1.txt"
    or die "cannot open > CC22: $!";

open FILE2, "file2.txt"
    or die "cannot open > CDS: $!";

open( OUTPUTFILE, ">$outputfile" ) or die "Could not open output file: $! \n";
my @file1list = ();

while (<FILE1>) {
    if (/^(\d+)/) {
        push @file1list, $1;
    }
}

while (<FILE2>) {
    if (/^(\d+)\s+(\d+)\s+(\S+)/) {
        my $CDS1 = $1;
        my $CDS2 = $2;
        my $CDS3 = $3;

        for my $CC22 (@file1list) {
            if ( $CC22 > $CDS1 && $CC22 < $CDS2 ) {
                print OUTPUTFILE "$CC22 $CDS1 $CDS2 $CDS3\n";
            }
        }
    }
}

(该程序还存在风格问题(例如变量的大写字母),但我忽略了这些,对于初学者来说这是一个非常好的程序)

关于perl - 将 FILE1 值与 FILE2 范围进行比较并打印匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26422841/

相关文章:

perl - 安装新模块时 dmake 实际上在做什么?

PHP ↔ Perl 接口(interface)或绑定(bind)

perl - 阅读最后两行,而不是 Perl 中的前两行

批评 : How can I resolve '^Magic variable "$ENV"should be assigned as "local"'?

perl - pg_dump 单个表——可以在循环中执行吗?

perl - 确定屏幕尺寸的跨平台技术

Perl - 在文件或数组中查找重复行

perl - 通过 cpan 安装 perl 模块 Net::SSLeay

perl - 如何使用 Perl 的 SOAP::Lite 编辑 SOAP 信封和 header ?

bash - Perl 比较两个文件并打印出现的情况