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