删除感兴趣的行数低于截止值(Perl)
我有几个包含以下格式文本的列的文件“数字/数字:零,感兴趣的数字”。示例:“1/1:0,13” 如果任何列中感兴趣的行数少于20,则需要删除行。 我更喜欢使用egrep,而不是读取文件,但不确定如何在单个语句中计算每列中的感兴趣数量 我还删除了包含SVLEN=-1或SVLEN=-2的行,并且它似乎与egrep配合得很好:删除感兴趣的行数低于截止值(Perl),perl,Perl,我有几个包含以下格式文本的列的文件“数字/数字:零,感兴趣的数字”。示例:“1/1:0,13” 如果任何列中感兴趣的行数少于20,则需要删除行。 我更喜欢使用egrep,而不是读取文件,但不确定如何在单个语句中计算每列中的感兴趣数量 我还删除了包含SVLEN=-1或SVLEN=-2的行,并且它似乎与egrep配合得很好: $cmd2 = `egrep -v 'SVLEN=-1;|SVLEN=-2;' $my_vcf > $my_new_vcf`; print $cmd1; 我尝试了以下方
$cmd2 = `egrep -v 'SVLEN=-1;|SVLEN=-2;' $my_vcf > $my_new_vcf`; print $cmd1;
我尝试了以下方法,但无效:
my $cmd2 = `egrep -v 'SVLEN=-1;|SVLEN=-2;|(\,(\d+) < 20)' $my_vcf > $my_new_vcf`; print $cmd2;
my$cmd2=`egrep-v'SVLEN=-1|SVLEN=-2|(\,(\d+)<20)$my\u vcf>$my\u new\u vcf`;打印$cmd2;
谢谢。
egrep
是用于此目的的错误工具,因为它不能在其正则表达式中进行数学运算。
因为您已经有了一个Perl脚本,所以最好使用Perl命令来实现您的目标
不幸的是,您必须逐行打开并读取文件,但这正是egrep
所做的。否则它怎么能判断台词呢
#!/usr/bin/env perl
use strict;
use warnings;
use List::Util;
sub filter_lines
{
my $in_filename = shift;
my $out_filename = shift;
open( my $fhin, '<', $in_filename ) or die "cannot open $in_filename: $!\n";
open( my $fhout, '>', $out_filename ) or die "cannot open $out_filename: $!\n";
while ( my $line = <$fhin> ) {
next if ( $line =~ /SVLEN=-1;|SVLEN=-2;/ );
if ( my @numbers_of_interest = ( $line =~ m/\d+\/\d+:0,(\d+)/g ) ) {
next unless List::Util::min(@numbers_of_interest) < 20;
}
print $fhout $line;
}
close($fhin);
close($fhout);
}
filter_lines( $my_vcf, $my_new_vcf );
#/usr/bin/env perl
严格使用;
使用警告;
使用列表::Util;
子滤波器线路
{
我的$in_filename=shift;
my$out\u filename=shift;
打开(我的$fhin、、$out\U文件名)或死亡“无法打开$out\U文件名:$!\n”;
while(我的$line=){
下一个if($line=~/SVLEN=-1;|SVLEN=-2;/);
如果(我感兴趣的@numbers\u=($line=~m/\d+\/\d+:0,(\d+)/g)){
下一步除非List::Util::min(@numbers\u of\u interest)<20;
}
打印$fhout$行;
}
收盘价($fhin);
结束($fhout);
}
过滤线($my_vcf,$my_new_vcf);
因为我没有精确的输入行,所以感兴趣的
@numbers\u
的模式可能有点不准确,需要改进。如果代码运行缓慢,还有很大的优化空间。请显示一些完整的输入行。它们是否包含多个列,如“1/1:0,13”、“1/1:0,14”、“1/1:0,30”
?这些列是如何分开的?用逗号,
?它们是否被引号包围“
?为什么要使用Perl脚本中的egrep
?在这种情况下,Perl将比egrep好得多。是的,多个列由tab分隔,但也有多行标题。每个文件中的列数可能不同。文件中没有引号。当我在命令行上打印时,这些行看起来像0/0:0,0/0:0,0 0/0:0,0 0/0:0,10。欢迎提出其他建议。谢谢。完整的输入行:chr7 55242417。ACTCTGGATCCCAGAAGAGAAGGTGAGAAAGTTAAATCCCGTCGCTATCAAGGAATTAAAGAGAGAGAGAGAGAC AACTCTCTGGATCCCAGAAGAGGAAGTTAAATTCCGT CGCTATCA。通过端=55242479;霍姆伦=0;SVLEN=-62;SVTYPE=RPL;NTLEN=48 GT:AD 0/0:0,0 0/0:0,0 0/0:0,0 0/0:0,0 0/0:0,10/0:0,0是否可以使用Perl在一行中执行此操作?或者您必须打开逐行读取并按选项卡拆分的每个文件?谢谢“我更喜欢使用egrep而不是在文件中读取”您是否意识到,egrep
也必须“读取文件”?没有读取数据就无法过滤数据!我不能使用List::Util::min.@user3781528:为什么不能使用List::Util::min
?行use List::Utils代码>应该是使用列表::Util()代码>-这解决了您的问题吗?我可以使用List::Util qw(min-max);