perl一次读取多行并按条件输出的实例教程

发布时间:2020-07-14编辑:脚本学堂
perl一次读取多行并按条件输出的实例教程,有需要的朋友参考下。

perl一次读取多行并按条件输出的实例教程,有需要的朋友参考下。

perl中通常是每次读取一行,例如:
open(H,“a.txt”)
while($line=<H>)
{     }

例如:
 

复制代码 代码如下:

open(INFILE, "E:/hebing_5.txt");
open(OUTFILE, ">E:/alignment_5.txt")|| die "Cannot open the newfile: $!n";

while (<INFILE>) {
       if (!/*/){
        print OUTFILE "$_";}
}
exit;

如果想用perl每次读取文件的多行,可以采用下面的方法;例如:
 

复制代码 代码如下:

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

open (TEST, "<E:/alignment_1.txt");
open(OUTFILE, ">E:/123.txt")|| die "Cannot open the newfile: $!n";

while (<TEST>) {
    if(index ($_, "=") > -1){
    my $position=tell(TEST);
    my $keyword_line=$_;
    my $line_1=<TEST>;
    my $line_2=<TEST>;

    # @a=split//,$keyword_line;  比较它们的元素是否相等,一直没成功
    # @b=split//,$line_1;         利用if ($a[0]eq $a[0])来判断
    # @c=split//,$line_2;

    if (($line_2)&&(index($line_2, "=")>-1)){ # 或者if ($line_2=~/=/)

    print OUTFILE "$_$line_1";
                        }
    if (!($line_2)) { print OUTFILE "$_$line_1"; last; }

    seek(TEST, $position, 0);
                }

                }
close (TEST);
exit;

以上的例子,每次按条件读入三行,并且按照条件输出两行。

以下命令主要解决了如下的问题:
在一个文件中,首字符为Query=的行下面是一行首字符为Sbjct:的行,如果Query=的行下面有多行Sbjct:的行,则这样的Query=行和Sbjct: 行全部去掉,也就是在输出文件中不输出。

Query= SNP169  Query: 1       ttgtcatagtatatacaaagtaaccgatccattcactcaaa 41
Sbjct: 1449137 ttgtcatagtatatacaaagtaaccgatccattcactcaaa 1449097
Query= SNP170  Query: 1       tgatttaataatattaagggctcggtaatccaaatcatcta 41
Sbjct: 1448134 tgatttaataatattaagggctcggtaatccaaatcatcta 1448094
Query= SNP171  Query: 1       attgagattcacttgcctagaccggatccttattcggactc 41
Sbjct: 1447804 attgagattcacttgcctagaccggatccttattcggactc 1447764
Query= SNP173  Query: 1       gactgtgtatccacctagcatcgaacaaatggataaacatt 41
Sbjct: 1443270 gactgtgtatccacctagcatcgaacaaatggataaacatt 1443230
Query: 1        gactgtgtatccacctagcatcgaacaaatggataaacatt 41
Sbjct: 16461763 gactgtgtatccacctagcaccgaacaaatggatatacatt 16461803
Query: 1        gactgtgtatccacctagcatcgaacaaatggataaacatt 41
Sbjct: 15766602 gactgtgtatccacctagcaccgaacaaatggatatacatt 15766562
Query= SNP174  Query: 1       aagttgtgattcttgcatcatcatgacactctttttcattc 41
Sbjct: 1442959 aagttgtgattcttgcatcatcatgacactctttttcattc 1442919
Query: 1        aagttgtgattcttgcatcatcatgacactctttttcattc 41
Sbjct: 13904658 aagttgtgattcttgcatcaccatgacactctttttcattc 13904618
Query: 1        aagttgtgattcttgcatcatcatgacactctttttcattc 41
Sbjct: 12731873 aagttgtgattcttgcatcaccatgacactctttttcattc 12731913
Query= SNP175  Query: 1       aaattgatgaacgctctacatatgaatcatttgtgttcaag 41
Sbjct: 1442912 aaattgatgaacgctctacatatgaatcatttgtgttcaag 1442872
Query: 1        aaattgatgaacgctctacatatgaatcatttgtgttcaag 41
Sbjct: 13904611 aaattgatgaaagctctacacatgaatcatttgtgttcaag 13904571
Query: 1        aaattgatgaacgctctacatatgaatcatttgtgttcaag 41
Sbjct: 12731920 aaattgatgaaagctctacacatgaatcatttgtgttcaag 12731960
Query= SNP176  Query: 1       ttccgcgacgattcgaactcgtgcccttgggatttcactgc 41
Sbjct: 1436960 ttccgcgacgattcgaactcgtgcccttgggatttcactgc 1436920

结果如下:
Query= SNP169  Query: 1       ttgtcatagtatatacaaagtaaccgatccattcactcaaa 41
Sbjct: 1449137 ttgtcatagtatatacaaagtaaccgatccattcactcaaa 1449097
Query= SNP170  Query: 1       tgatttaataatattaagggctcggtaatccaaatcatcta 41
Sbjct: 1448134 tgatttaataatattaagggctcggtaatccaaatcatcta 1448094
Query= SNP171  Query: 1       attgagattcacttgcctagaccggatccttattcggactc 41
Sbjct: 1447804 attgagattcacttgcctagaccggatccttattcggactc 1447764
Query= SNP176  Query: 1       ttccgcgacgattcgaactcgtgcccttgggatttcactgc 41
Sbjct: 1436960 ttccgcgacgattcgaactcgtgcccttgggatttcactgc 1436920

或使用如下程序-------
每次输入四行,如果第二行不含N,那么则输出这四行:
 

复制代码 代码如下:

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

open(INFILE, "/home/liuguiyou/1.fastq");
open(OUTFILE, ">/home/liuguiyou/1_no_N.fastq")|| die "Cannot open the newfile: $!n";

while (<INFILE>) {
    if(/^@d+:d+:d+:/){
    my $position=tell(INFILE);
    my $keyword_line=$_;
    my $line_1=<INFILE>;
    my $line_2=<INFILE>;
    my $line_3=<INFILE>;

    my @a=split//,$line_1;
    my $b=join" ",@a;

    if (($b)&&!($b=~/N/)){       

    print OUTFILE "$keyword_line$line_1$line_2$line_3";
   }
   seek(INFILE, $position, 0);
}
}
close (INFILE);
exit;
 

输入数据:

@4:1:1:819:N
CAATACTCATAAAAACACNNNNNNNNNNNNNNNNNNNN
+
######################################
@4:1:2:826:N
CAAAAGAAAATACGAAGCNNNNNNNNNNNNNNNANNNN
+
######################################
@4:1:2:873:N
CTGAAAGAGACCCTACCANNNNNNNNNNNNANNANNNN
+
######################################
@4:1:2:1545:N
CCCGCACCTACATCATAANNNNNNNNNNNNANNTNCNN
+
######################################
@4:1:2:1:N
AAAAAAAAAAAAAAAAAANNANNNNNNANNANNAAANN
+
@@<9<999<@<###########################
@4:1:3:1540:N
CAGCAGCACGACATTAATGCTCTCACACTTANTCCCNC
+
######################################
@4:1:3:1393:N
GCATCTCGTGCACACACGCACCGTTACGTAANCACACA
+
######################################
@4:1:3:1366:Y
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+
@@<@<<@@@<@=<<@<@@<;<@@<;@;@;@@#######
@4:1:3:1386:N
ACCAACACACCCAAATCTGCAACCCATACTACCACACC
+
######################################
输出文件:
@4:1:3:1366:Y
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+
@@<@<<@@@<@=<<@<@@<;<@@<;@;@;@@#######
@4:1:3:1386:N
ACCAACACACCCAAATCTGCAACCCATACTACCACACC
+
######################################