Python 如何筛选文件中的组以仅显示第2列值的不同组合?

Python 如何筛选文件中的组以仅显示第2列值的不同组合?,python,bash,unix,awk,Python,Bash,Unix,Awk,我有一个类似以下内容的文件: 1 Ape 5138150 5140933 1 Ape 4289 7147 1 Ape 2680951 2683603 1 Ape 1484200 1486662 1 Baboon 3706008 3708636 1 Baboon 11745108 11747790 1 Baboon 3823683 3826474 2 Baboon 250 33 2 Ape 1 89 3 Elephant 18 691 3 Ape 1

我有一个类似以下内容的文件:

1   Ape 5138150 5140933
1   Ape 4289 7147
1   Ape 2680951 2683603
1   Ape 1484200 1486662
1   Baboon 3706008 3708636
1   Baboon 11745108 11747790
1   Baboon 3823683 3826474

2   Baboon 250 33
2   Ape 1 89

3   Elephant 18 691
3   Ape 1 824
3   Baboon 3000 4569

4   Frog 823145 826431
4   Sloth 35088 37788
4   Snake 1071033 1074121

6   Tiger 2951524 2953649
6   Lion 178820 180879
其中第1列显示组号,第2列显示该组中的不同动物。我感兴趣的是这个文件中有多少种不同的动物组合。例如,我想把第一组减少到
Ape,Baboon
,然后忽略第二组(因为已经看到了Ape+Baboon的组合),但保留第三组(因为这个组也包括大象,因此不同)。因此,输出可能类似于:

Ape, Baboon

Elephant, Ape, Baboon

Frog, Sloth, Snake

Tiger, Lion
如果可能的话,保留这些动物组合来自哪一组是很好的,但这并不是一个优先事项!有没有关于我该怎么做的想法?提前谢谢

试试这个:

#!/usr/bin/env perl

use strict;
use warnings;

my %groups;
$/ = "\n\n";

while (<>) {
    my %a = ();
    for my $f ( split /\n/ ) { $a{ (split /\s+/, $f)[1] } = 1 }
    $groups{ join ', ', sort keys %a } = 1;
}

print $_, "\n" for ( sort keys %groups );

基于我对昨天问题()的解决方案,再次使用GNU awk表示
长度(数组)

$cat tst.awk
开始{RS=”“;ORS=“\n\n”FS=“\n”OFS=“,”}
{
删除键
对于(i=1;i=1{
i=0
keyList=“”
用于(输入键){
keyList=keyList(++i>1?of s:“”)键
}
如果(!看到[keyList]++){
打印号码,密钥列表
}
}
$awk-f tst.awk文件
1、猿、狒狒
3、猿、狒狒、大象
懒惰、蛇、青蛙
狮子,老虎

注意,您昨天问了一些非常类似的问题:展示一些代码可能很好,可能是公认的解决方案有一个很好的起点。
Ape, Baboon
Ape, Baboon, Elephant
Frog, Sloth, Snake
Lion, Tiger
$ cat tst.awk
BEGIN { RS=""; ORS="\n\n"; FS="\n"; OFS=", " }
{
    delete keys
    for (i=1; i<=NF; i++) {
        split($i,f," ")
        keys[f[2]]
    }
}
length(keys) > 1 {
    i=0
    keyList=""
    for (key in keys) {
        keyList = keyList (++i>1?OFS:"") key
    }
    if (!seen[keyList]++) {
        print NR, keyList
    }
}

$ awk -f tst.awk file
1, Ape, Baboon

3, Ape, Baboon, Elephant

4, Sloth, Snake, Frog

5, Lion, Tiger