【问题标题】:Perl to remove new lines from input file and write to output filePerl 从输入文件中删除新行并写入输出文件
【发布时间】:2016-09-28 11:34:33
【问题描述】:

我的输入是一个包含一系列字符串的文件,如下所示:
ABCDEFGHIJKL
XKGKASKGKD
SGJKSKGS

我想删除新行并将输出写入新文件:ABCDEFGHIJKLXKGKASKGKDSGJKSKGS

到目前为止,我有这个:

#! /usr/bin/perl
use strict;
use warnings;
my $input = $ARGV[0];
my $output = "concatenated.txt"; #Output sequence
#Open output file
open >"$output"; or die "unable to open $output";
#Open input file
open "<$input" or die "unable to open $input";

while (<INPUT>) {
   if( /^[AGCT]/)
   chomp;

print $output;
}

close $input;

close $output;


print "Done!\n";

但它还不起作用。
在这种情况下 chomp 是否足以连接?
如何将我创建的内容写入输出文件?

【问题讨论】:

  • 潜在输入有多大?
  • 发布的代码有很多错误。在我的脑海中:在shebang中反转#!,在chomp之后缺少;,不正确的开放语句(两者)。请修复您的代码,显示您实际运行的内容,也许有人可以帮助您。
  • 如果文件相对较小,这可以在 1 行正则表达式中轻松完成:$input =~ s/\s+//g
  • ...甚至,为什么要使用 perl?只需在 1 行 shell 命令中执行:sed -r 's/\s+//g' input.txt &gt; output.txt

标签: perl concatenation bioinformatics


【解决方案1】:

您可以使用单行过滤器。

给定:

$ cat /tmp/so.txt
ABCDEFGHIJKL
XKGKASKGKD
SGJKSKGS

Perl(使用-0777 吞下整个文件):

$ perl -0777 -lpe 's/\s+//g;' /tmp/so.txt > /tmp/out.txt

或者,如果您不想“吞咽”:

$ perl -pe 's/\s+//g' /tmp/so.txt > /tmp/out.txt

tr,如果它只是换行符:

$ tr -d '\n' < /tmp/so.txt > /tmp/out.txt

其中任何一个:

$ cat /tmp/out.txt
ABCDEFGHIJKLXKGKASKGKDSGJKSKGS

【讨论】:

    【解决方案2】:

    因此,您似乎缺少文件句柄,并且我不确定您要使用 if 语句来完成什么。但这里有一些代码将接受您的输入并为您提供上面的输出:

    use strict;
    use warnings;
    
    my $input = $ARGV[0];
    my $output = "concatenated.txt"; #Output sequence
    
    #Open output file
    open (my $OUTPUT, '>', $output) or die "unable to open $output";
    #Open input file
    open (my $INPUT, '<', $input) or die "unable to open $input";
    
    while (<$INPUT>) {
        chomp;
        $_ =~ s/\s+//g;
        print $OUTPUT $_;
    }
    
    close $input;
    close $output;
    print "Done!\n";
    

    如果您只想删除换行符并保留其余空格,则可以删除 $_ =~ s/\s+//g; 行。

    【讨论】:

    • 请注意,您应该使用 open()...open my $OUTPUT, '&gt;', $output or die $!open my $INPUT, '&lt;', $input or die $!; 的 3-arg 形式
    【解决方案3】:

    如果我猜对了 :-) 如果您的文件看起来像这样,包含 1 个以上的序列,则需要在 id 行和序列的最后一行之后保留换行符。

    perl 1 内衬可能是这样的:

    perl -0777 -pe 's/^[TAGC]+\K\n(?!&gt;)//gm' fasta.txt &gt; concatenated.txt

    -0777 表示将整个文件合并为一个字符串。

    这个替换表示匹配从行首开始的所有[TAGC],(使用\K,保留之前的所有内容,不要擦除)。然后是换行符\n,后面没有&gt;,(下一行的开头是id)。

    如果新行是序列行并且后面没有新的 id 行,则这会擦除新行。 g 开关表示全局执行此操作,m 开关允许插入符号 ^line 的开头进行匹配,而不是其通常的行为,在字符串。

    >NR_037701 1
    AGGAGCTATGAATATTAATGAAAGTGGTCCTGATGCATGCATATTAAACA
    TGCATCTTACATATGACACATGTTCACCTTGGGGTGGAGACTTAATATTT
    AAATATTGCAATCAGGCCCTATACATCAAAAGGTCTATTCAGGACATGAA
    GGCACTCAAGTATGCAATCTCTGTAAACCCGCTAGAACCAGTCATGGTCG
    GTGGGCTCCTTACCAGGAGAAAATTACCGAAATCACTCTTGTCCAATCAA
    AGCTGTAGTTATGGCTGGTGGAGTTCAGTTAGTCAGCATCTGGTGGAGCT
    GCAAGTGTTTTAGTATTGTTTATTTAGAGGCCAGTGCTTATTTAGCTGCT
    AGAGAAAAGGAAAACTTGTGGCAGTTAGAACATAGTTTATTCTTTTAAGT
    GTAGGGCTGCATGACTTAACCCTTGTTTGGCATGGCCTTAGGTCCTGTTT
    GTAATTTGGTATCTTGTTGCCACAAAGAGTGTGTTTGGTCAGTCTTATGA
    CCTCTATTTTGACATTAATGCTGGTTGGTTGTGTCTAAACCATAAAAGGG
    AGGGGAGTATAATGAGGTGTGTCTGACCTCTTGTCCTGTCATGGCTGGGA
    ACTCAGTTTCTAAGGTTTTTCTGGGGTCCTCTTTGCCAAGAGCGTTTCTA
    TTCAGTTGGTGGAGGGGACTTAGGATTTTATTTTTAGTTTGCAGCCAGGG
    TCAGTACATTTCAGTCACCCCCGCCCAGCCCTCCTGATCCTCCTGTCATT
    CCTCACATCCTGTCATTGTCAGAGATTTTACAGATATAGAGCTGAATCAT
    TTCCTGCCATCTCTTTTAACACACAGGCCTCCCAGATCTTTCTAACCCAG
    GACCTACTTGGAAAGGCATGCTGGGTCTCTTCCACAGACTTTAAGCTCTC
    CCTACACCAGAATTTAGGTGAGTGCTTTGAGGACATGAAGCTATTCCTCC
    CACCACCAGTAGCCTTGGGCTGGCCCACGCCAACTGTGGAGCTGGAGCGG
    GAGGGAGGAGTACAGACATGGAATTTTAATTCTGTAATCCAGGGCTTCAG
    TTATGTACAACATCCATGCCATTTGATGATTCCACCACTCCTTTTCCATC
    TCCCAGAAGCCTGCTTTTTAATGCCCGCTTAATATTATCAGAGCCGAGCC
    TGGAATCAAACTGCCTCTTTCAAAACCTGCCACTATATCCTGGCTTTGTG
    ACCTCAGCCAAGTTGCTTGACTATTCTCAGTCTCAGTTTCTGCACCTGTC
    AAATAGGGTTTATGTTAACCTAACTTTCAGGGCTGTCAGGATTAAATGAG
    CATGAACCACATAAAATGTTTGGTGTATAGTAAGTGTACAGTAAATACTT
    CCATTATCAGTCCCTGCAATTCTATTTTTCTTCCTTCTCTACACAGCCCC
    TGTCTGGCTTTAAAATGTCCTGCCCTGCTTTTTATGAGTGGATACCCCCA
    GCCCTATGTGGATTAGCAAGTTAAGTAATGACACTCAGAGACAGTTCCAT
    CTTTGTCCATAACTTGCTCTGTGATCCAGTGTGCATCACTCAAACAGACT
    ATCTCTTTTCTCCTACAAAACAGACAGCTGCCTCTCAGATAATGTTGGGG
    GCATAGGAGGAATGGGAAGCCCGCTAAGAGAACAGAAGTCAAAAACAGTT
    GGGTTCTAGATGGGAGGAGGTGTGCGTGCACATGTATGTTTGTGTTTCAG
    GTCTTGGAATCTCAGCAGGTCAGTCACATTGCAGTGTGTCGCTTCACCTG
    GCTCCCTCTTTTAAAGATTTTCCTTCCCTCTTTCCAACTCCCTGGGTCCT
    GGATCCTCCAACAGTGTCAGGGTTAGATGCCTTTTATGGGCCACTTGCAT
    TAGTGTCCTGATAGAGGCTTAATCACTGCTCAGAAACTGCCTTCTGCCCA
    CTGGCAAAGGGAGGCAGGGGAAATACATGATTCTAATTAATGGTCCAGGC
    AGAGAGGACACTCAGAATTTCAGGACTGAAGAGTATACATGTGTGTGATG
    GTAAATGGGCAAAAATCATCCCTTGGCTTCTCATGCATAATGCATGGGCA
    CACAGACTCAAACCCTCTCTCACACACATACACATATACATTGTTATTCC
    ACACACAAGGCATAATCCCAGTGTCCAGTGCACATGCATACACGCACACA
    TTCCCTTCCTAGGCCACTGTATTGCTTTCCTAGGGCATCTTCTTATAAGA
    CACCAGTCGTATAAGGAGCCCACCCCACTCATCTGAGCTTATCAACCAAT
    TACATTAGGAAAGACTGTATTTCCTAGTAAGGTCACATTCAGTAGTACTG
    AGGGTTGGGACTTCAACACAGCTTTTTGGGGGATCATAATTCAACCCATG
    ACAGCCACTGAGATTATTATATCTCCAGAGAATAAATGTGTGGAGTTAAA
    AGGAAGATACATGTGGTACAAGGGGTGGTAAGGCAAGGGTAAAAGGGGAG
    GGAGGGGATTGAACTAGACACAGACACATGAGCAGGACTTTGGGGAGTGT
    GTTTTATATCTGTCAGATGCCTAGAACAGCACCTGAAATATGGGACTCAA
    TCATTTTAGTCCCCTTCTTTCTATAAGTGTGTGTGTGCGGATATGTGTGC
    TAGATGTTCTTGCTGTGTTAGGAGGTGATAAACATTTGTCCATGTTATAT
    AGGTGGAAAGGGTCAGACTACTAAATTGTGAAGACATCATCTGTCTGCAT
    TTATTGAGAATGTGAATATGAAACAAGCTGCAAGTATTCTATAAATGTTC
    ACTGTTATTAGATATTGTATGTCTTTGTGTCCTTTTATTCATGAATTCTT
    GCACATTATGAAGAAAGAGTCCATGTGGTCAGTGTCTTACCCGGTGTAGG
    GTAAATGCACCTGATAGCAATAACTTAAGCACACCTTTATAATGACCCTA
    TATGGCAGATGCTCCTGAATGTGTGTTTCGAGCTAGAAAATCCGGGAGTG
    GCCAATCGGAGATTCGTTTCTTATCTATAATAGACATCTGAGCCCCTGGC
    CCATCCCATGAAACCCAGGCTGTAGAGAGGATTGAGGCCTTAAGTTTTGG
    GTTAAATGACAGTTGCCAGGTGTCGCTCATTAGGGAAAGGGGTTAAGTGA
    AAATGCTGTATAAACTGCATGATGTTTGCAGGCAGTTGTGGTTTTCCTGC
    CCAGCCTGCCACCACCGGGCCATGCGGATATGTTGTCCAGCCCAACACCA
    CAGGACCATTTCTGTATGTAAGACAATTCTATCCAGCCCGCCACCTCTGG
    ACTCCCTCCCCTGTATGTAAGCCCTCAATAAAACCCCACGTCTCTTTTGC
    TGGCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAA
    >NM_198399 1
    AACAGATTTTAACTCTGAAAAGCCATTTCCAGTGTCTATAGACTATTGTG
    AGCCTGGAGAAGTAGCATTTAGTTGGGATAGCTTCACTAGAGCTGCCTGC
    CAAAGACTTCCTTCCACAGGATCTTGTCGCACCAGCAACTGACAGGAGCT
    TGGGAGCTCGGGAGCTTGGGAGAGGGCTTATGTTTTTAATAATGTAGCTG
    TCAGTTCGAAGCCTGGAAATGTTGACCCTCAAAGGGCATAAAATCTTGTT
    ATTTTAATTTGCATCTGGGAGAATGTCTGAGCAAGGAGACCTGAATCAGG
    CAATAGCAGAGGAAGGAGGGACTGAGCAGGAGACGGCCACTCCAGAGAAC
    GGCATTGTTAAATCAGAAAGTCTGGATGAAGAGGAGAAACTGGAACTGCA
    GAGGCGGCTGGAGGCTCAGAATCAAGAAAGAAGAAAATCCAAGTCAGGAG
    CAGGAAAAGGTAAACTGACTCGCAGCCTTGCTGTCTGTGAGGAATCTTCT
    GCCAGACCAGGAGGTGAAAGTCTTCAGGATCAGACTCTCTGAAAACTGCA
    AATGGAAAGGAATTCAAAAGAATTTAGATTAAAAGTTAAATAAAAAGTAG
    GCACAGTAGTGCTGAATTTTCCTCAAAGGCTCTCTTTTGATAAGGCTGAA
    CCAAATATAATCCCAAGTATCCTCTCTCCTTCCTTGTTGGAGATGTCTTA
    CCTCTCAGCTCCCCAAAATGCACTTGCCTATAAGAAACACAATTGCTGGT
    TCATATGAAACTTAGGAAATAGTGAATAAGGTGCATTTAACTTTGGAGAA
    ATACTTTTATGGCTTTGGTGGAGATTTCTCAATACTGCAAAAGTTGTCCA
    GAAATGAATCTGAGCTGATGGTGACTTTAAGTTAATATTATTAATATATC
    ACTGCATATTTTTACCCTTATTTTTGCTCCTTACAGCAAGATTAGTAGGT
    TATAAAAATTTAAATTTAAACAAAATTATTTCATGACAAAATGGGAAACT
    TCACATCATACTTATTTTTGTTTGCCTTTCAGGCATCATATTAGCTTTTA
    TAAAAAATGGTCTTGCTGCTGAAATTGTACTTATTTTATCAGAGGCTGGG
    TGCAGTCAAGACAAAAGTAAAATGGTTTACCTGAGCCCAGGGGAGGGAAA
    ATTGATTAAGATATCATTATTTTTGTTTGGTTTGGTTTTGCTTTTTTCCT
    CTTACTTTAATTGAAATACTCTGAATTCCCCTCATGGAAACAGAGAGCAT
    TGAGAGCACTTTCTTTAAAAGGACCAAAAATAAATTCCTAATAGATTTTG
    

    更新如果您需要脚本中的解决方案,那么以下将产生与命令行相同的结果。

    命令行是perl yourscript.pl fasta.txt 请注意,我没有显式打开“fasta.txt”,而是使用了空文件句柄&lt;&gt;。读取命令行指定的 fasta 文件。

    #!/usr/bin/perl
    use strict;
    use warnings;
    
    # Output sequence
    my $output = "concatenated.txt";
    
    open my $handle, '>', $output or die "unable to open $output";
    
    my $current = <>;
    
    while (my $next = <>) {
    
        # if current line is seq characters (not a header)
        # AND the next line isn't a header
        if (substr($current, 0, 1) ne '>' && substr($next, 0, 1) ne '>') {
            chomp($current)
        }
    
        print $handle $current;
        $current = $next;
    
        # print last line if at the end of file
        print $handle $current if eof;
    }
    

    【讨论】:

      【解决方案4】:
      perl -pe 'chomp' infile > outfile
      

      【讨论】:

        猜你喜欢
        • 2011-07-06
        • 2014-10-18
        • 1970-01-01
        • 2018-08-07
        • 1970-01-01
        • 1970-01-01
        • 2021-11-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多