Eu quero manipular as entradas do arquivo de grupo [closed]

0

Suponha que eu tenha um arquivo:

uid=1(a) groups=cat,dog,hen
uid=2(b) groups=cat,hen
uid=3(c) groups=hen
uid=4(d) groups=dog,hen,buffalo,horse

Estou procurando:

cat a,b
dog a,d
hen a,b,c,d
buffalo d
horse d

Lista 1: usuários e amp; Grupos secundários (para cada usuário)

Lista 2: Grupos e amp; Usuários (pertencentes ao grupo)

    
por Abi 03.03.2016 / 14:45

3 respostas

1
awk -F "[= ,()]" '{
    for(i=6;i<=NF;i++){
        if(a[$i] != ""){
            a[$i]=a[$i]","$3
        }else{
            a[$i]=$3
        }
    }
}
END{
    for ( i in a){
        print i,a[i]
    }
}'

crie um array com índices como cada membro do grupo e adicione append uid a este array quando o membro do grupo for encontrado em uma linha. no END prin o índice da matriz, bem como o valor na matriz.

    
por 03.03.2016 / 15:22
0
#!/usr/bin/env perl
use strict;
use warnings;
use feature qw(say);

my %groups;

while ( my $line = readline *STDIN ) {
  chomp $line;
  if ( $line =~ m/\((?<user>[^)]+)\) groups=(?<groups>.+)/ ) {
    for my $groupname ( split ',', $+{groups} ) {
      push @{ $groups{$groupname} }, $+{user};
    }
  } else {
    warn "NOTICE non-matching line $. - '$line'\n";
  }
}

for my $groupname ( sort keys %groups ) {
  say $groupname, ' ', join ',', @{ $groups{$groupname} };
}

Esta versão usa um hash (grupos) de referências de matriz (os usuários) e avisa se não pode corresponder a uma linha de entrada (seus dados estão corrompidos? como você saberia?).

    
por 03.03.2016 / 16:47
0

com perl :

perl -lne '
  if (/^uid=\d+\((.+)\) groups=(.*)/) {
    push @{$u{$_}}, $1 for split /,/, $2;
  }
  END {
    $" = ",";
    print "$_ @{$u{$_}}" for keys %u;
  }'
    
por 03.03.2016 / 16:49