perl使用一行程序来分割每个给定单词的文件
再次提出一些问题。我有一份表格文件:perl使用一行程序来分割每个给定单词的文件,perl,file,split,Perl,File,Split,再次提出一些问题。我有一份表格文件: >seq1 123 234 56 167 332 22 23 456 098 >seq2 123 234 56 167 332 22 23 456 098 我想让一个文件保存每个>seq#,如下所示: 文件1: >seq1 123 234 56 167 332 22 23 456 098 文件2: >seq2 123 234 56 167 332 22 23 456 098 我可以使用perl脚本,但想知道如何使用perl一行程
>seq1
123 234 56
167 332 22
23 456 098
>seq2
123 234 56
167 332 22
23 456 098
我想让一个文件保存每个>seq#,如下所示:
文件1:
>seq1
123 234 56
167 332 22
23 456 098
文件2:
>seq2
123 234 56
167 332 22
23 456 098
我可以使用perl脚本,但想知道如何使用perl一行程序来实现这一点,只是为了增加我的perl知识
谢谢 这是一个相当简单的脚本,用于执行此任务:
use strict;
use warnings;
my $fh = *STDOUT;
while (<>)
{
chomp;
if (m/^>/)
{
close $fh;
open $fh, $_ or die "Failed to open $_";
}
print $fh "$_\n";
}
不过,我不可能推荐这样做。(是的,两个空格都是必需的。)这是一个相当简单的脚本,用于执行此任务:
use strict;
use warnings;
my $fh = *STDOUT;
while (<>)
{
chomp;
if (m/^>/)
{
close $fh;
open $fh, $_ or die "Failed to open $_";
}
print $fh "$_\n";
}
不过,我不可能推荐这样做。(是的,这两个空格都是必要的。)看着,我想出了一些奇怪的东西,可以发布一个新的答案。我想补充一点,这应该被视为一个练习示例(可能是混淆),而不是任何正确的代码。解决方案的全部功劳归于乔纳森。此外,正如下面所解释的,这是一个危险的解决方案
perl -ple 'open STDOUT, $_' yourfile.txt
这依赖于以>seq1
开头的行,这些行将与发现的旧2参数open
一起使用。例如,open$fh,“>seq1”
将创建(覆盖)并打开文件seq1
进行写入
同时,默认情况下,任何没有有效“模式”符号的行--
,
等--都将被打开进行读取,如果我们打赌该目录中不存在名为123 234 56
等的文件,我们可以依靠open
以静默方式失败,并维护以前打开的STDOUT
文件句柄
通过使用-l
选项,我们不需要chomp
$\uu
,以便打开
不会失败,也不需要在打印中添加换行符。同时,-p
选项将负责创建,同时
循环并进行打印
由于默认情况下打印转到STDOUT
,因此我们需要做的就是重新打开STDOUT
文件句柄,输入文件的内容将处理其余部分
此一行程序的完整代码,带有注释,以指示哪些部件来自哪个开关:
BEGIN { $/ = "\n"; $\ = "\n"; } # -l, gives newlines to print
while (<>) { # -p
chomp $_; # -l
open STDOUT, $_; # our code
}
continue {
print STDOUT $_; # -p
}
BEGIN{$/=“\n”$\=“\n”}-l,提供要打印的换行符
while(){#-p
大口大口
打开STDOUT,$#我们的代码
}
继续{
打印标准输出$;#-p
}
注意:此代码将释放打开
命令的全部功能,这是危险的,因为在这种情况下,允许在文件系统上执行任意命令。这是允许使用2参数打开的一个副作用。看看,我想出了一些奇怪的东西,可以发布一个新的答案。我想补充一点,这应该被视为一个练习示例(可能是混淆),而不是任何正确的代码。解决方案的全部功劳归于乔纳森。此外,正如下面所解释的,这是一个危险的解决方案
perl -ple 'open STDOUT, $_' yourfile.txt
这依赖于以>seq1
开头的行,这些行将与发现的旧2参数open
一起使用。例如,open$fh,“>seq1”
将创建(覆盖)并打开文件seq1
进行写入
同时,默认情况下,任何没有有效“模式”符号的行--
,
等--都将被打开进行读取,如果我们打赌该目录中不存在名为123 234 56
等的文件,我们可以依靠open
以静默方式失败,并维护以前打开的STDOUT
文件句柄
通过使用-l
选项,我们不需要chomp
$\uu
,以便打开
不会失败,也不需要在打印中添加换行符。同时,-p
选项将负责创建,同时
循环并进行打印
由于默认情况下打印转到STDOUT
,因此我们需要做的就是重新打开STDOUT
文件句柄,输入文件的内容将处理其余部分
此一行程序的完整代码,带有注释,以指示哪些部件来自哪个开关:
BEGIN { $/ = "\n"; $\ = "\n"; } # -l, gives newlines to print
while (<>) { # -p
chomp $_; # -l
open STDOUT, $_; # our code
}
continue {
print STDOUT $_; # -p
}
BEGIN{$/=“\n”$\=“\n”}-l,提供要打印的换行符
while(){#-p
大口大口
打开STDOUT,$#我们的代码
}
继续{
打印标准输出$;#-p
}
注意:此代码将释放
打开
命令的全部功能,这是危险的,因为在这种情况下,允许在文件系统上执行任意命令。这是允许使用2参数open的一个副作用。你知道有很多用于生物学的模块,对吗?是的,我知道,但我还是想试试一行。这些不是fasta文件,而是实际的数字表。除非有一个模块提供支持,否则您可能会发现它太大,无法成为一个正常的单行程序。我99%肯定我会用十几行来完成这项任务。通过使用>seq1
行作为open
的双参数形式的参数,您可能会稍微作弊,但这只是一个小问题。这在很大程度上取决于您希望代码的健壮程度。@JonathanLeffler实际上,如果您使用$/=“\n>”
,您可能很容易做到这一点<代码>perl-lwe'$/=“\n>”;而(){打开我的$fh,“>”,“文件”.++$i..txt“或死$!;打印$fh$;}seq.txtHmmm。。。不,那不太管用,我现在明白了,嗯,也许可以调整一下。你知道有很多生物模块,对吧?是的,我知道,但我还是想试试一行。这些不是fasta文件,而是实际的数字表。除非有一个模块提供支持,否则您可能会发现它太大而无法正常工作-