前几天在网上看到了一个PERL 文本解析的问题,大概如下
-CCTTTATCTAATTTTTGGTGCATGAG-CCGGA-ATAATCGGAACAGCTT
-CCTTTATCTAATTTTTGGTGCATGAGCCGGAA-TAATCGGAACAGCT--
-CCTTTATCTAATTTTTGGTGCA-TGAGCCGGA-ATAATCGGAACAGC--
-CCTTTATCTAATTTTT-GGTGCATGAGCCGGA-ATAATCGGAACAGCT-
-CCTTTATCTAATTTTTGGTGCATGAGCCGGAA-TAATCGGAACAGCTTT
-CCTTTATCTAATTTTTGGTGCATGAGCCGGAA-TAATCGGAACAGCTTT
-CCTTTATCTAATTTTTGGTGCATGAGCCGGAA-TAATCGGAACAGCTTT
-CCTTTATCTAATTTTTGGTGCATGAGCCGGAA-TAATCGGAACAGCTT-
-CCTTTATCTAATTTTTGGTGCATGAGCCGGAA-TAATCGGAACAGCT--
-CCTTTATCTAATTTTTGGTGCATGAGCCGGAA-TAATCGGAACAGCTTT
-CCTTTATCTAATTTTTGGTGCATGAGCCGGAA-TAATCGGAACAGCTTT
这 是一个文件,每一行都等长。要求如下:
一、如果在某一列的相同位置都出现了‘-’,那么就删除此列。比如第一列全是“-”,那么就删 除这一列。返回新的数组。
二、再对新的数组操作,假如新的数组还存在有带“-”的行,那么就删除这一行。输出剩下的数组。每一行都是没有“-”
一看就想到要把这个文本列转置,如果行都是'-'就删除这行。再把文本转置回来,接着把行中出现'-'就把这行再删除,剩下的行就没有'-'。
想想这个列到行的转置还是有点麻烦的,后最放弃,换个思路。。
其实这里也就是要求:
一、保留行中出现最少的'-'或是没有'-'的行。比如测试的文本行出现最少的'-'次数是两次。如果出现多于两次的,那其中一定有某列‘-’上不是所有都是‘-’。
二、最后去掉剩下行内的‘-’
#!/usr/bin/perl -w
use strict;
open my $file,'<',"test.txt" ;
open(LOG,'>test_1.txt');
my $less_time=10000;
my @lines = undef;
while(my $line = <$file>){
my @line_time = $line =~ m/-/g;
if(@line_time < $less_time){
$less_time = @line_time;
@lines = undef;
push(@lines,$line);
}elsif(@line_time == $less_time){
push(@lines,$line);
}
}
foreach my $outLine(@lines){
print LOG $outLine;
}
close(LOG);
close($file);