Regex 防止";"富",;“来自匹配”;“富吧”;与grep-w
我在我的Perl脚本中使用grep,并尝试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
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}};
}