Como encontrar o número de pares não ordenados de uma lista

6

Eu quero contar o número de pares não ordenados de uma lista.

Em outras palavras, tenho uma lista:

ab
ba
ac
bc

e quero exibir:

2 ab
1 ac
1 bc
    
por user112 01.08.2017 / 12:43

4 respostas

8

Parece um bom trabalho para perl :

perl -F -lane '$count{join "", sort @F}++;
               END{print "$count{$_} $_" for sort keys %count}' < your-file
    
por 01.08.2017 / 12:56
7

com gawk :

gawk -F '' '{ print ($1 > $2) ? $2$1 : $1$2 }' | sort | uniq -c

Cada campo corresponde a um caractere ( -F '' ). Nós apenas invertemos os caracteres se o primeiro for maior que o segundo de acordo com a localidade atual (o que não importa). Então ordenamos o resultado e contamos as mesmas linhas consecutivas com uniq -c .

    
por 01.08.2017 / 15:23
3

Aqui está uma maneira genérica com versões recentes do GNU awk:

gawk -i join '
{
  split($0, F, //)
  asort(F)
  h[join(F, 1, length(F), SUBSEP)]++
}
END {
  asorti(h, x)
  for(k in h) 
    print h[k], k
}' infile

Ou como um script separado:

order.awk

@include "join"
{
  split($0, F, //)
  asort(F)
  h[join(F, 1, length(F), SUBSEP)]++
}
END {
  asorti(h, x)
  for(k in h) 
    print h[k], k
}

Execute assim:

gawk -f order.awk infile

Saída:

2 ab
1 ac
1 bc
    
por 01.08.2017 / 16:52
0

fish shell:

⋊> ~ echo 'ab
     ba
     ac
     bc' | while read line; echo -n "$line" | sed -r 's|(.)|\n|g' | sort | xargs | tr --delete ' '; end | uniq -c

bash shell:

bash-3.2$ echo 'ab
ba
ac
bc' | while read line; do echo -n "$line" | sed -r 's|(.)|\n|g' | sort | xargs | tr --delete ' '; done | uniq -c

Saída:

     2 ab
     1 ac
     1 bc
    
por 01.08.2017 / 17:59