Python 计数两个模式之间的重复记录

Python 计数两个模式之间的重复记录,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

我想计算两个模式之间的重复记录,并将它们打印到模式一和模式二旁边

输入 集群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&&$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)