【问题标题】:how to take file as input and ignore the new line character如何将文件作为输入并忽略换行符
【发布时间】:2011-03-07 15:59:10
【问题描述】:

以下是fasta fileA的内容:

>1
PLAARRPRRGKSLAGFESLACSFPVVSRGFLASRSARSLSSEGGTMPDNRQ
PRNRQPRIRSGNEPRSAPAMEPDGRGAWAHSRAALDRLEKLLRCSRCTNIL
REPVCLGGCEHIFCSNCVSDCIGTGCPVCYTPAWIQDLKINRQLDSMIQL

>2
PLWRPAVPDAGRARPVWSRWSAASLWFLKASLLPALRGAFHPKAGRCRIIGS
RGTGSRGSAPGTSLVPRPPWNRMVAVPGPTVAPRSTAWRSCCAARVVLTF*E
SLCV*EDVSTSSVVIV*VTALELDVQCVTPRPGYKT*R*ID

>3
TPPLWRPAVPDAGRAWPVSSRWPAASRWFPEASLLPALRGAFHPKAGRCRII
GSRGTGSRGSAPGTSLVPRPPWNRMVAVPGPTVAPRSTAWRSCCAARVVLTF

现在我需要将 fileA 作为输入,找出 1 和 2 以及 1-3 之间存在的不匹配,并找出它们之间的核苷酸变化。到目前为止,我已经编写了一个程序,但它不接受 fileA 作为输入。请帮忙

我的问题是我需要将 fileA 作为输入,并且序列在每 51 个核苷酸之后包含换行符,我的程序也考虑换行符来找出不匹配。

计划:

$a=<>;$b=<>;
@mul=("$a","$b");

for($i=0;$i<scalar(@mul)-1;$i++) {
    $source=$mul[$i];
    print "\n\nComparision of source:  $mul[$i]\n";
    print "------------------------------------";
    for($j=$i+1;$j<scalar(@mul);$j++) {
        $sample=$mul[$j];
        print "\n$sample ";
        print "\n------\n";
        $t=mutate($source,$sample);
        print $t;
    }
}

sub mutate {
    my ($s1,$s2)=@_;
    $temp="";
    for($k=0;$k<length($s1);$k++) {
        $seq1=substr($s1,$k,1);
        $seq2=substr($s2,$k,1);
        if($seq1 ne $seq2) {
            $temp.="[$seq1($k)/$seq2($k)]";
        } 
    }
    return $temp;
}

【问题讨论】:

  • 你的问题到底是什么?
  • 要删除换行符,您可以使用 chomp 或使用正则表达式 s/\n//g
  • @aki 我也尝试过使用 chomp ......但它没有给出输出......无法找出问题所在。
  • 这是你的实际文件吗(我假设你的文件看起来像你上面粘贴的那样)。是在linux还是windows下。
  • 你能把问题解释清楚吗?是这样的吗,您的文件有三组行,并且在各组之间要打印匹配的字符数与文件中字符总数的比率。

标签: perl bioinformatics


【解决方案1】:

您可能想阅读段落,这些段落由一行中的两个换行符标记。因此:

use strict;
use warnings;
my(@a);

{
    # Limit the scope in which you reset the $/ variable
    local($/) = "\n\n";
    while (<>)
    {
         s/\n+//gm;  # Remove all newlines
         push @a, $_;
    }
}

# Now your array contains three items with no newlines - process away...

【讨论】:

  • 警告:输入中的换行符可能用“\r\n”而不是“\n”来标记。
  • @reinierpost:当然;它们也可以仅用 '\r' 标记(MacOS 9 或更早版本)。必要时进行调整。
【解决方案2】:

如果我正确理解了您的问题,那么您可以通过以下方式从命令行读取文件,以便获得不同文件的结果。 这里我们读取每一行并获取源编号,然后在 chomp 之后,将每一行附加到相应的源。然后您可以将任何行与任何源内容进行比较。

my $file = $ARGV[0];
open (FILE, $file);
my $file_content;
my $src_indx = 0;
while (my $line = <FILE>){
    chomp $line;
    $line =~ s/^\s+//;


    if ($line =~ /^\>(\d+)/){
        $file_content->{$1} = '';
        $src_indx = $1;

    }else{
        $file_content->{$src_indx} .= $line;
    }
}

print "\n\nComparision of source:  1 and 2\n";
print "------------------------------------\n";
$t = mutate($file_content->{1},$file_content->{2});
print $t;

sub mutate {
    my ($s1,$s2)=@_;
    $temp="";
    for($k=0;$k<length($s1);$k++) {
        $seq1=substr($s1,$k,1);
        $seq2=substr($s2,$k,1);
        if($seq1 ne $seq2) {
            $temp.="[$seq1($k)/$seq2($k)]";
        } 
    }
    return $temp;
}

我没有修改你的 mutate 函数。如果使用正则表达式或 split 代替 substr,也可以更好地控制 mutate。

如果这不是你想要的,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 2021-07-29
    相关资源
    最近更新 更多