2012-12-05 10 views
1

我有一個Perl問題。我有一個文件,這個文件的每一行包含不同數量的TS G和C 的文件看起來像下面Perl - 在一個固定數量的字符ina文件中添加新的行和製表符?

ATCGCTGASTGATGCTG 
GCCTAGCCCTTAGC 
GTTCCATGCCCATAGCCAAATAAA 

我想添加行號的每一行 然後插入一個\ n每6字符,然後在每一個新行的創建把一個 空空間每3個字符的輸出的

實施例應該是

Line NO 1     
ATC GCT 
GAS TGA 
TGC TG 

Line NO 2 
GCC TAG 
CCC TTA 
GC 

我已經提出了以下的代碼:

my $count = 0; 
    my $line; 
    my $row; 
    my $split; 
    open(F, "Data.txt") or die "Can't read file: $!"; 
    open (FH, " > UpDatedData.txt") or die "Can't write new file: $!"; 
    while (my $line = <F>) { 
     $count ++ ; 
     $row = join ("\n", ($line =~ /.{1,6}/gs)); 
     $split = join ("\t", ($row =~ /.{3}/gs)); 
     print FH "Line NO\t$count\n$split\n"; 
    } 
    close F; 
    close FH; 

然而

它提供了以下出來把

Line NO 1     
ATC GCT 
GA STG A 
T GCT G 

Line NO 2 
GCC TAG 
CC CTT A 
G C 

這必須有一些與\ n的這行代碼

$split = join ("\t", ($row =~ /.{3}/gs)); 

被算作一個字符任何人有任何想法如何解決這個問題?

任何幫助將不勝感激。

預先感謝

西尼德

回答

0

這是一個班輪:

perl -plwe 's/(.{3})(.{0,3})/$1 $2\n/g' data.txt 

正則表達式查找3個字符(不匹配換行),然後是0-3的字符和捕獲這兩者,然後在它們和換行符之間插入一個空格。

爲了保持行號的軌道,你可以添加

s/^/Line NO $.\n/; 

這將列舉根據輸入的行號。如果你願意,你可以保留一個簡單的計數器,如++$i

  • -l選項將爲您處理換行符。

你也可以做到這一點在兩個階段,像這樣:

perl -plwe's/.{6}\K/\n/g; s/^.{3}\K/ /gm;' 

這裏使用\K(保持)轉義序列,以保持字符串匹配的部分,然後簡單地插入新行後6個字符,然後在「行開始」之後有一個3個字符的空格,其中/m修飾符還包含換行符。

因此,簡而言之:

perl -plwe 's/.{6}\K/\n/g; s/^.{3}\K/ /gm; s/^/Line NO $.\n/;' data.txt 
perl -plwe 's/(.{3})(.{0,3})/$1 $2\n/g; s/^/Line NO $.\n/;' data.txt 
+0

感謝,這是非常有益的 – sinead

+0

不客氣。 – TLP

0

另一種解決方案。請注意,它使用詞法文件句柄三種參數形式的open

#!/usr/bin/perl 
use warnings; 
use strict; 

open my $IN, '<', 'Data.txt'  or die "Can't read file: $!"; 
open my $OUT, '>', 'UpDatedData.txt' or die "Can't write new file: $!"; 
my $count = 0; 
while (my $line = <$IN>) { 
    chomp $line; 
    $line =~ s/(...)(...)/$1 $2\n/g;   # Create pairs of triples 
    $line =~ s/(\S\S\S)(\S{1,2})$/$1 $2\n/; # A triple plus something at the end. 
    $line .= "\n" if $line !~ /\n$/;   # A triple or less at the end. 
    $count++; 
    print $OUT "Line NO\t$count\n$line\n"; 
} 
close $OUT; 
1

這應該解決您的問題:

use strict; 
use warnings; 

while (<DATA>) { 
    s/(.{3})(.{0,3})?/$1 $2 /g; 
    s/(.{7}) /$1\n/g; 

    printf "Line NO %d\n%s\n", $., $_; 
} 

__DATA__ 
ATCGCTGASTGATGCTG 
GCCTAGCCCTTAGC 
GTTCCATGCCCATAGCCAAATAAA 
相關問題