Perl来从输入文件中删除新行并写入到输出文件
我的输入是一系列的字符串的文件,像这样:
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个序列,你需要保持换行符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;
}
您可以使用单线过滤器。
考虑:
$ 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
所以,它看起来像你缺少你的文件句柄,我不知道你是想用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;
线。
请注意,您应该使用3-arg形式的open() ...'打开我的$ OUTPUT,'>',$ output或者$!''并打开我的$ INPUT,' stevieb
@stevieb - 你是对的。对不起这是我的错。 – FrankRalphBob
perl -pe 'chomp' infile > outfile
潜在投入有多大? – dawg
发布的代码有很多错误。关闭我的头顶:在shebang中反转'#!',在'chomp'后面缺少';',错误的打开语句(两者都是)。请修复你的代码,显示你的*实际*运行,也许有人可以帮助你。 –
如果文件比较小,可以用1行的正则表达式来完成:'$ input =〜s/\ s + // g' –