perl,<correct input,=“”grep =“”

时间:2016-05-11 21:21:19

标签: perl grep

=“”

请不要评论说我已经问过这个,这是一个逻辑问题,我知道它主要是类似的代码,但有一些潜在的语法问题,我无法破译,花了几个小时调试这个没有希望,我真的需要这个答案。而其他帐户已被删除,所以我在半小时前发布了这个帖子,但无法查看。如果您想提供帮助,请仅发表评论。

它应该工作一切都在数据中,它应该是结果,我已经让它工作,所以它必须只是如此语法的东西,我没有注意到。我无法完成这项工作。我几乎可以肯定这是grep声明。

#!/usr/bin/perl
use warnings;
use strict;
open ("data", "<text.txt") or die "Can't open";        #
        my @data = <data>;              #file looking into
        close "data";           #
while(<>){
        chomp;
        my $temp = $_;
        my ($name, $number, $expression) = split("\t", $temp);
        my $pattern = "\t";
        my @found = grep ( /(^$name$pattern\|$pattern$number$)/, @data );
        if(defined($found[0])){
                print $_;
                my ($what, $start, $stop, $chr, $who) = split("\t", $found[0]);
                print "\t", $chr, $start, $stop;
                @found = ();
        }
}
print "\n";

输入格式为

A1B 1   68

A1C 299 0

A2B 547 0

A2L 877 30

A2M 2   7944

这是数据文件的格式

CLDN8   30214006    30216073    21  68

A1C  20808776    20811809    Y   

UBE2Q2P5Y   25431156    25437315    Y   

OR5M9   56462469    56463401    11  390162

我想搜索数据文件中输入文件的第一列或第二列中的项目实例,这些项目应分别与第一列和第五列(可能不存在)匹配

预期输出应为此示例

A1B 1   68 21 30214006    30216073
A1C 299 0 Y 20808776    20811809

但我什么都没得到

1 个答案:

答案 0 :(得分:2)

认为你正在寻找的是这个,但是真的很难说,因为你已经把你的问题描述得很糟糕了

我不得不做出很多假设,但至少输出符合你所说的预期

use strict;
use warnings 'all';

my $data_file = 'text.txt';

my @data;
{
    open my $fh, '<', $data_file or die qq{Unable to open "$data_file" for input: $1};
    while ( <$fh> ) {
        next unless /\S/;
        push @data, [ split ];
    }
}

while ( <> ) {
    next unless /\S/;

    my ($name, $number, $expression) = split;

    for my $item ( @data ) {

        my ($what, $start, $stop, $chr, $who) = @$item;

        if ( $what eq $name or defined $who and $who eq $expression ) {
            print join("\t", $name, $number, $expression, $chr, $start, $stop), "\n";
        }
    }
}

输出

A1B 1   68  21  30214006    30216073
A1C 299 0   Y   20808776    20811809