Python 计数两个模式之间的重复记录
我想计算两个模式之间的重复记录,并将它们打印到模式一和模式二旁边 输入 集群1Python 计数两个模式之间的重复记录,python,linux,perl,Python,Linux,Perl,我想计算两个模式之间的重复记录,并将它们打印到模式一和模式二旁边 输入 集群1 一个 一个 两个 两个 两个 集群2 两个 一个 一个 两个 集群3 一个 集群4 两个 两个 一个 输出 集群1 2 3 集群2 集群3 1 0 第4组1 2 我尝试过awk,但它只计算集群之间的行数,而不是重复的行数 我试过这个代码 cut -d _ -f2 norm_nonnorm_merged-95-count-new.clstr | sort | uniq -c | awk '$1>1&&am
一个
一个
两个
两个
两个
集群2
两个
一个
一个
两个
集群3
一个
集群4
两个
两个
一个 输出 集群1 2 3
集群2
集群3 1 0
第4组1 2 我尝试过awk,但它只计算集群之间的行数,而不是重复的行数 我试过这个代码
cut -d _ -f2 norm_nonnorm_merged-95-count-new.clstr | sort | uniq -c | awk '$1>1&&$0=$2 " - " $1 " times"'
它打印
one - 6 times
two - 7 times
也试过
awk ' />Cluster/ { if ( f!="") {print f-1}; f=0;f1=1 } f1 { f++ } ' norm_nonnorm_merged-95.clstr
它打印
5
4
1
3
较长形式的perl脚本解决方案:
use strict;
use warnings;
my %allkeys;
my @clusters;
while (<DATA>) {
chomp;
if (/^Cluster/) {
push @clusters, [$_, {}];
} else {
$clusters[-1][1]{$_}++;
$allkeys{$_}++;
}
}
my @sortedkeys = sort keys %allkeys;
for my $cluster (@clusters) {
print "$cluster->[0] " . join(' ', map {$cluster->[1]{$_} // 0} @sortedkeys) . "\n";
}
__DATA__
Cluster 1
one
one
two
two
two
Cluster 2
two
one
one
two
Cluster 3
one
Cluster 4
two
two
one
这在Python中起作用:
txt='''\
Cluster 1
one
one
two
two
two
Cluster 2
two
one
one
two
Cluster 3
one
Cluster 4
two
two
one
'''
import re
for t in re.findall(r'(Cluster \d)(.*?)(?=Cluster|$)', txt, re.S):
print t[0],t[1].count('one'), t[1].count('two')
印刷品:
Cluster 1 2 3
Cluster 2 2 2
Cluster 3 1 0
Cluster 4 1 2
(未测试…)
我是这个论坛的新手:请看一看。您使用的是Python还是Perl?向我们展示您在awk中所做的工作。也许我们可以修改代码。非常感谢你的代码。它很好用。是否可以将输出保存为3个文件。One.txt(two=0)、two.txt(One=0)和One-two.txt(两者均>0)。非常感谢您的代码。我已经修改了一点(\d+)并且效果很好。是否可以将输出保存为3个文件。One.txt(two=0)、two.txt(One=0)和One-two.txt(两者均>0)。
Cluster 1 2 3
Cluster 2 2 2
Cluster 3 1 0
Cluster 4 1 2
import re
fn1='one.txt'
fn2='two.txt'
fn3='one-two.txt'
with open(fn1, 'w') as f1, open(fn2, 'w') as f2, open(fn3, 'w') as f3:
for t in re.findall(r'(Cluster \d+)(.*?)(?=Cluster|$)', txt, re.S):
one=t[1].count('one')
two=t[1].count('two')
out= '{} {} {}\n'.format(t[0], one, two)
if one and two:
f3.write(out)
elif one:
f1.write(out)
elif two:
f2.write(out)