Awk 对一行中的多个唯一字符串进行计数
这是我的第一篇文章。我想写一个小脚本来计算一行中的多个唯一重复。文本是一个DNA序列,因此文本将是四个字母的组合:a、T、G和C。 如果一个字符串出现两次,它将被计数两次,依此类推 我想寻找的唯一字符串是三个AG、GA、CT或TC的重复,分别是(AG)3、(GA)3、(CT)3和(TC)3。我不希望程序计算四次或更多次的重复 要计数的字符串: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
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)
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