如何使用perl删除fasta文件中的空格?

时间:2014-08-22 19:46:30

标签: regex perl

我的fasta文件

>1a17_A a.118.8 TPR-like
PADGALKRAEELKTQANDYFKAKDYENAIKFYSQAIELNPSNAIYYGNRS
LAYLRTECYGYALGDATRAIELDKKYIKGYYRRAASNMALGKFRAALRDY
ETVVKVKPHDKDAKMKYQECNKIVKQKAFERAIAGDEHKRSVVDSLDIES
MTIEDEYS 

否则请尝试使用http://www.ncbi.nlm.nih.gov/nuccore/?term=keratin来获取fasta文件。

open(fas,'d:\a4.fas');
$s=<fas>;
@fasta = <fas>;
@r1 = grep{s/\s//g} @fasta; #It is not remove the white space
@r2 = grep{s/(\s)$//g} @fasta; #It is not working
@r3 = grep{s/.$//g} @fasta; #It is remove the last character, but not remove the    last space
print "@r1\n@r2\n@r3\n";

这些代码的输出是:

PADGALKRAEELKTQANDYFKAKDYENAIKFYSQAIELNPSNAIYYGNRS LAYLRT
ECYGYALGDATRAIELDKKYIKGYYRRAASNMALGKFRAALRDY ETVVKVKPHDKDAKMKYQECNKIVKQKAFERAIAG
DEHKRSVVDSLDIES MTIEDEYS

我希望从第2行和第2行删除空格。我该怎么办?

4 个答案:

答案 0 :(得分:3)

使用perl one liner,

perl -i -pe 's|[ \t]||g' a4.fas

删除所有空格,包括新行

perl -i -pe 's|\s||g' a4.fas

答案 1 :(得分:1)

use strict;
use warnings;

while(my $line = <DATA>) {
    $line =~ s/\s+//g;
    print $line;
}


__DATA__
PADGALKRAEELKTQANDYFKAKDYENAIKFYSQAIELNPSNAIYYGNRS
LAYLRTECYGYALGDATRAIELDKKYIKGYYRRAASNMALGKFRAALRDY
ETVVKVKPHDKDAKMKYQECNKIVKQKAFERAIAGDEHKRSVVDSLDIES
MTIEDEYS 

答案 2 :(得分:1)

grep是对数组进行更改的错误选择。它过滤输入数组的元素,仅作为输出传递大括号{ .. }中的表达式为 true 的元素。

替换s/// true ,除非它没有对目标字符串进行任何更改,因此对grep语句没有任何更改,

@r1 = grep { s/\s//g } @fasta

这将从@fasta中的字符串中删除所有空格,包括换行符。它只在@r1中放入那些最初包含空格的元素,这些元素可能全部都以新行结尾。

@r2 = grep { s/(\s)$//g } @fasta

由于锚$,如果它是一个空格字符,这将删除字符串末尾换行符之前的字符。它还删除了换行符。字符串结尾之前的任何空格都是不变的。它只在@r2中放入以空格结尾的那些元素,这些元素可能全部以新行结束。

@r3 = grep { s/.$//g } @fasta;

这将删除换行符之前的字符,无论它是否为空格。它离开换行符,以及结束前的任何空格。它只在@r3中放入那些不仅仅包含换行符的元素,这些换行符可能都是新行。

我认为您希望保留换行符(通常被视为空格)。

此示例将读取除标题之外的整个文件到变量$data,然后使用tr///删除空格和制表符。

use strict;
use warnings;
use 5.010;
use autodie;

my $data = do {
  open my $fas, '<', 'D:\a4.fas';
  <$fas>; # Drop the header
  local $/;
  <$fas>;
};

$data =~ tr/ \t//d;
print $data;

答案 3 :(得分:1)

perlrecharclass

  

\h匹配任何被认为是水平空格的字符;这包括平台的空格和制表符以及下表中列出的其他几个字符。 \H匹配任何不被视为水平空格的字符。他们使用平台的本机字符集,不考虑任何可能正在使用的语言环境。

因此,以下内容将显示删除了水平间距的文件:

perl -pe "s|\h+||g" d:\a4.fas

如果您不想显示标题,只需添加$.的条件

perl -ne "s|\h+||g; print if $. > 1" d:\a4.fas

注意:我在上述命令中使用了双引号,因为您的D:\音量意味着您很可能在Windows上。