我有一个Perl问题。我有一个文件这个文件的每一行包含不同数量的As Ts Gs和Cs 该文件如下所示
ATCGCTGASTGATGCTG
GCCTAGCCCTTAGC
GTTCCATGCCCATAGCCAAATAAA
我想为每一行添加行号 然后每6个字符插入一个\ n,然后在每个创建的新行上放一个 空格每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 ));
任何人都知道如何解决这个问题?
非常感谢任何帮助。
提前致谢
Sinead
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分:0)
另一种解决方案。请注意,它使用 lexical filehandles 和 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;