Awk 对一行中的多个唯一字符串进行计数

Awk 对一行中的多个唯一字符串进行计数,awk,count,line,unique,repeat,Awk,Count,Line,Unique,Repeat,这是我的第一篇文章。我想写一个小脚本来计算一行中的多个唯一重复。文本是一个DNA序列,因此文本将是四个字母的组合:a、T、G和C。 如果一个字符串出现两次,它将被计数两次,依此类推 我想寻找的唯一字符串是三个AG、GA、CT或TC的重复,分别是(AG)3、(GA)3、(CT)3和(TC)3。我不希望程序计算四次或更多次的重复 要计数的字符串: AGAGAG GAGAGA CTCTCT TCTCTC 输入文件示例(由选项卡分隔的两列): 期望输出: Sequence_1 AGAGAG

这是我的第一篇文章。我想写一个小脚本来计算一行中的多个唯一重复。文本是一个DNA序列,因此文本将是四个字母的组合:a、T、G和C。 如果一个字符串出现两次,它将被计数两次,依此类推

我想寻找的唯一字符串是三个AG、GA、CT或TC的重复,分别是(AG)3、(GA)3、(CT)3和(TC)3。我不希望程序计算四次或更多次的重复

要计数的字符串:

AGAGAG
GAGAGA
CTCTCT
TCTCTC
输入文件示例(由选项卡分隔的两列):

期望输出:

Sequence_1    AGAGAG                   1
Sequence_2    AGAGAGT                  1
Sequence_3    AGAGAGAG                 0
Sequence_4    AGAGAT                   0
Sequence_5    AGAGAGAGAGAGAGAGAG       0
Sequence_6    AGAGAGTAGAGAG            2
Sequence_7    CTCTCTCTCTCAAGAGAG       1 
Sequence_8    TAGAGAGAT                1
Sequence_9    TAAGAGAGAAG              1
我用awk编写了一个小的单行程序,但我认为它在匹配字符串时并不具体:

awk '{if($1 ~ /AGAGAG/)x++; if($1 ~ /TCTCTC/)x++;if($1 ~ /GAGAGA/)x++;if($1 ~ /CTCTCT/)x++;print x;x=0}' inputfile.tab

非常感谢你的帮助。最好的是,Bernardo,我认为您的描述与示例输入和输出中存在一些不一致之处。因此,这个脚本可能并不完美,但我希望它足够接近您,您可以了解其余内容:

#!/usr/bin/perl -n

my ($seq, $dna) = split(/\s+/);
my @strings = qw/AG GA CT TC/;
my $count = 0;
foreach my $s (@strings) {
    my ($b, $e) = split(//, $s);
    @matches = $dna =~ m/(?<!$e)($s){3}(?!$b)/g;
    $count += scalar(@matches);
}
print join("\t", $seq, sprintf("%-20s", $dna), $count), "\n";
它给出:

Sequence_1    AGAGAG                1
Sequence_2    AGAGAGT               1
Sequence_3    AGAGAGAG              0
Sequence_4    AGAGAT                0
Sequence_5    AGAGAGAGAGAGAGAGAGT   0
Sequence_6    AGAGAGTAGAGAG         2
Sequence_7    CTCTCTCTCTCAAGAGAG    1
工作原理:

  • 由于shebang中的
    -n
    标志,脚本将针对来自
    stdin
  • @strings
    是我们感兴趣的字符串列表
  • 对于
    @strings
    中的每个项目,我们计算匹配项
    • $s
      具有
      AG
      GA
      CT
      TC
    • 表达式
      (?匹配3个连续的
      $s
      ,后面不跟
      $s
      ,前面不跟
      $s
    • 表达式
      (?匹配3个连续的
      $s
      ,后面不跟
      $s
      的第一个字符,前面不跟
      $s
      的第二个字符
    • 操作
      $x=~m///g
      返回所有匹配项的数组
    • scalar(@matches)
      是所有匹配项的数组大小,我们将其添加到计数中

我认为您的描述以及示例输入和输出中存在一些不一致之处。因此,此脚本可能并不完美,但我希望它足够接近,以便您能够找出其余的问题:

#!/usr/bin/perl -n

my ($seq, $dna) = split(/\s+/);
my @strings = qw/AG GA CT TC/;
my $count = 0;
foreach my $s (@strings) {
    my ($b, $e) = split(//, $s);
    @matches = $dna =~ m/(?<!$e)($s){3}(?!$b)/g;
    $count += scalar(@matches);
}
print join("\t", $seq, sprintf("%-20s", $dna), $count), "\n";
它给出:

Sequence_1    AGAGAG                1
Sequence_2    AGAGAGT               1
Sequence_3    AGAGAGAG              0
Sequence_4    AGAGAT                0
Sequence_5    AGAGAGAGAGAGAGAGAGT   0
Sequence_6    AGAGAGTAGAGAG         2
Sequence_7    CTCTCTCTCTCAAGAGAG    1
工作原理:

  • 由于shebang中的
    -n
    标志,脚本将针对来自
    stdin
  • @strings
    是我们感兴趣的字符串列表
  • 对于
    @strings
    中的每个项目,我们计算匹配项
    • $s
      具有
      AG
      GA
      CT
      TC
    • 表达式
      (?匹配3个连续的
      $s
      ,后面不跟
      $s
      ,前面不跟
      $s
    • 表达式
      (?匹配3个连续的
      $s
      ,后面不跟
      $s
      的第一个字符,前面不跟
      $s
      的第二个字符
    • 操作
      $x=~m///g
      返回所有匹配项的数组
    • scalar(@matches)
      是所有匹配项的数组大小,我们将其添加到计数中

Hi janos。毫无疑问,序列_3必须具有零计数。尽管它包含字符串(GA)3,但这一个同时位于(AG)中4,所以不应算作阳性。抱歉,如果我没有足够强调的话!我修改了脚本,为您的输入生成了所需的输出。但我不确定它是否能处理所有角落的情况。请测试它,如果您发现一个未正确处理的情况,请更新问题中的示例。嗨,janos,我添加了序列8和9。有c算作负数,因为一个角后面跟第一个字符$s,或者前面跟第二个字符$s。我们应该修改脚本以容忍其中一种情况,但不能同时容忍这两种情况。对吗?这是一个难题…我现在很忙,但我会设法解决这个问题,并在几天内与您联系。也许到那时我会很忙真正的regex忍者会介入并为你完成它,我希望…嗨,janos,我会在本周帮助你的Dhi janos。毫无疑问,Sequence_3必须有零计数。虽然它包含字符串(GA)3,但这一个同时在a(AG)中4,所以不应算作阳性。抱歉,如果我没有足够强调的话!我修改了脚本,为您的输入生成了所需的输出。但我不确定它是否能处理所有角落的情况。请测试它,如果您发现一个未正确处理的情况,请更新问题中的示例。嗨,janos,我添加了序列8和9。有c算作负数,因为一个角后面跟第一个字符$s,或者前面跟第二个字符$s。我们应该修改脚本以容忍其中一种情况,但不能同时容忍这两种情况。对吗?这是一个难题…我现在很忙,但我会设法解决这个问题,并在几天内与您联系。也许到那时我会很忙真正的regex忍者会帮你完成的我希望…嗨janos,这个周末我会尽力帮你
Sequence_1    AGAGAG                1
Sequence_2    AGAGAGT               1
Sequence_3    AGAGAGAG              0
Sequence_4    AGAGAT                0
Sequence_5    AGAGAGAGAGAGAGAGAGT   0
Sequence_6    AGAGAGTAGAGAG         2
Sequence_7    CTCTCTCTCTCAAGAGAG    1