2016-09-27 162 views
0

我的输入是一系列的字符串的文件,像这样:
ABCDEFGHIJKL
XKGKASKGKD
SGJKSKGSPerl来从输入文件中删除新行并写入到输出文件

我想删除新线和输出写入到一个新的文件: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足以在此情况下连接吗?
如何将我创建的内容写入输出文件?

+1

潜在投入有多大? – dawg

+0

发布的代码有很多错误。关闭我的头顶:在shebang中反转'#!',在'chomp'后面缺少';',错误的打开语句(两者都是)。请修复你的代码,显示你的*实际*运行,也许有人可以帮助你。 –

+0

如果文件比较小,可以用1行的正则表达式来完成:'$ input =〜s/\ s + // g' –

回答

1

如果我猜右:-)如果你的文件看起来像这样超过1个序列,你需要保持换行符ID线和序列的最后一个行之后。

一个Perl 1内衬可能是这样的:

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

-0777说整个文件啜成一个字符串。

这个替换说要匹配从行首开始的所有[TAGC](使用\K,保留所有内容,不要擦除)。然后是一条\n换行符,后面跟着一个>,(以下行开头是id)。

如果它是一个序列行,并且没有跟随一个新的id行,这将删除新行。g开关表示要全局执行此操作,并且m开关允许插入符号匹配的开头,而不是匹配其通常的行为,即匹配字符串的开头。

>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”,我用的是空文件句柄,<>。读入命令行中指定的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; 
} 
3

您可以使用单线过滤器。

考虑:

$ 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;线。

+0

请注意,您应该使用3-arg形式的open() ...'打开我的$ OUTPUT,'>',$ output或者$!''并打开我的$ INPUT,'<',$ input或者die!!' – stevieb

+0

@stevieb - 你是对的。对不起这是我的错。 – FrankRalphBob

1
perl -pe 'chomp' infile > outfile 
相关问题