删除感兴趣的行数低于截止值(Perl)

删除感兴趣的行数低于截止值(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; 我尝试了以下方

我有几个包含以下格式文本的列的文件“数字/数字:零,感兴趣的数字”。示例:“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;
我尝试了以下方法,但无效:

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);