Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 防止";"富",;“来自匹配”;“富吧”;与grep-w_Regex_Bash_Perl_Grep - Fatal编程技术网

Regex 防止";"富",;“来自匹配”;“富吧”;与grep-w

Regex 防止";"富",;“来自匹配”;“富吧”;与grep-w,regex,bash,perl,grep,Regex,Bash,Perl,Grep,我在我的Perl脚本中使用grep,并尝试grep我给出的确切关键字。问题是“-w”不能识别“-”符号作为分隔符 例如: 假设我有两个记录: A1BG 0.0767377011073753 A1BG-AS1 0.233775553296782 如果我给 grep-w“A1BG” 它返回两个,但我只想要一个 有什么建议吗? 非常感谢 附言 这是我的全部代码。 输入文件是两列分隔的选项卡。所以,我想为每个基因保留一个唯一的值。如果我有多个记录,我会计算平均值 #!/usr/bin/pe

我在我的Perl脚本中使用grep,并尝试grep我给出的确切关键字。问题是“-w”不能识别“-”符号作为分隔符

例如: 假设我有两个记录:

A1BG    0.0767377011073753
A1BG-AS1    0.233775553296782
如果我给 grep-w“A1BG” 它返回两个,但我只想要一个

有什么建议吗? 非常感谢

附言

这是我的全部代码。 输入文件是两列分隔的选项卡。所以,我想为每个基因保留一个唯一的值。如果我有多个记录,我会计算平均值

#!/usr/bin/perl
use strict;
use warnings;

#Find the average fc between common genes
sub avg {
my $total;
$total += $_ foreach @_;
   return $total / @_;
}

my @mykeys = `cat G13_T.txt| awk '{print \$1}'| sort -u`;
foreach (@mykeys)
{
    my @TSS = ();

    my $op1 = 0;

    my $key = $_;
    chomp($key);
    #print "$key\n";
    my $command = "cat G13_T.txt|grep -E '([[:space:]]|^)$key([[:space:]]|\$)'";
    #my $command = "cat Unique_Genes/G13_T.txt|grep -w $key";
    my @belongs= `$command`;
    chomp(@belongs);
    my $count = scalar(@belongs);
    if ($count == 1) {
            print "$belongs[0]\n";
    }
    else {
            for (my $i = 0; $i < $count; $i++) {
                    my @token = split('\t', $belongs[$i]);
                    my $lfc = $token[1];
                    push (@TSS, $lfc);
            }
            $op1 = avg(@TSS);
            print $key ."\t". $op1. "\n";
    }
}
#/usr/bin/perl
严格使用;
使用警告;
#找出常见基因之间的平均fc
次平均值{
我的$total;
$total+=$\uForEach@;
返回$total/@;
}
my@mykeys=`catg13_T.txt | awk'{print\$1}'| sort-u`;
foreach(@mykeys)
{
我的@TSS=();
我的$op1=0;
我的$key=$\ux;
chomp($key);
#打印“$key\n”;
my$command=“cat G13_T.txt|grep-E'([[:space:]|^)$key([[:space:]\$)”;
#my$command=“cat Unique_Genes/G13_T.txt | grep-w$key”;
我的@beliens=`$command`;
咀嚼(@属于);
我的$count=标量(@bellings);
如果($count==1){
打印“$属于[0]\n”;
}
否则{
对于(我的$i=0;$i<$count;$i++){
my@token=split('\t',$属于[$i]);
my$lfc=$token[1];
推送(@TSS,$lfc);
}
$op1=平均值(@TSS);
打印$key.\t.$op1.\n;
}
}

您可以将POSIX ERE正则表达式与
grep一起使用,如下所示:

grep -E '([[:space:]]|^)A1BG([[:space:]]|$)' file
要仅返回匹配项(非匹配行),请执行以下操作:

详细信息

  • ([[:space:][]|^)
    -第1组:空白或行首
  • A1BG
    -子字符串
  • ([[:space:]|$)
    -第2组:空白或行尾

如果我在评论中得到了正确的澄清,那么目标是找到第一列中唯一名称的平均值(第二列)。那么就不需要外部工具了

逐行读取文件,并将每个名称的值相加。名称唯一性是通过使用散列来授予的,名称是键。除此之外,还可以跟踪他们的数量

use warnings;
use strict;
use feature 'say';

my $file = shift // die "Usage: $0 filename\n";

open my $fh, '<', $file or die "Can't open $file: $!";

my %results;

while (<$fh>) {
    #my ($name, $value) = split /\t/;
    my ($name, $value) = split /\s+/;  # used for easier testing

    $results{$name}{value} += $value;
    ++$results{$name}{count};
}

foreach my $name (sort keys %results) { 
    $results{$name}{value} /= $results{$name}{count} 
        if $results{$name}{count} > 1;

    say "$name => $results{$name}{value}";
}
现在我们不需要计数,因为它是由数组中的元素数(ref)给出的

请注意,以这种方式构建的哈希需要与文件大小相当的内存(甚至可能超过文件大小),因为所有值都是存储的

这是使用显示的两行样本数据测试的,在文件中重复和更改。代码不会以任何方式测试输入,但希望第二个字段始终为数字


请注意,没有任何理由退出我们的程序并使用外部命令。

请尝试使用
grep-E'([[:space:]|^)A1BG([[:space:]|$)”
使用
-w
而不是明确要求以空格结尾的字符串是否有特别的原因?或者从perl脚本中使用
grep
,这是perl在内部擅长做的事情吗?要清楚的是,grep认为哪些字符是单词分隔符,哪些字符不被认为是单词分隔符取决于语言环境,因此即使它在一个区域或一组语言设置中工作,也不会在任何地方工作。这是一个普遍存在于
grep-w
中的问题,当您想要匹配活动配置区域设置中除单词以外的任何内容时,这是一个错误的选择。@WiktorStribiżew好吧,我认为它起了作用!:)感谢you@Vasilis嗯,我的意思是“编辑”问题并将其添加到那里。好的,这是一个令人惊讶的方法!我希望我能那样想!非常感谢。@Vasilis很高兴你喜欢它:)。值得注意和记住的是,这是一个很好的例子,说明了散列(字典)的巨大效用及其典型用途之一。
use warnings;
use strict;
use feature 'say';

my $file = shift // die "Usage: $0 filename\n";

open my $fh, '<', $file or die "Can't open $file: $!";

my %results;

while (<$fh>) {
    #my ($name, $value) = split /\t/;
    my ($name, $value) = split /\s+/;  # used for easier testing

    $results{$name}{value} += $value;
    ++$results{$name}{count};
}

foreach my $name (sort keys %results) { 
    $results{$name}{value} /= $results{$name}{count} 
        if $results{$name}{count} > 1;

    say "$name => $results{$name}{value}";
}
while (<$fh>) {
    #my ($name, $value) = split /\t/;
    my ($name, $value) = split /\s+/;  # used for easier testing

    push @{$results{$name}}, $value;
}
use List::Util qw(sum);

foreach my $name (sort keys %results) {
    say "$name => ", sum(@{$results{$name}}) / @{$results{$name}};
}