Parece um bom trabalho para perl
:
perl -F -lane '$count{join "", sort @F}++;
END{print "$count{$_} $_" for sort keys %count}' < your-file
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
Parece um bom trabalho para perl
:
perl -F -lane '$count{join "", sort @F}++;
END{print "$count{$_} $_" for sort keys %count}' < your-file
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
.
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
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
Tags text-processing awk uniq gawk