E há uniq --ignore-case --count | sort --numeric --reverse
:
uniq -ic /tmp/foo.txt | sort -nr
8 hot chocolate
6 Xicolatada
E para mudar a ordem colocando uma vírgula lá, adicione:
... | sed -e 's/^ *\([0-9]*\) \(.*\)/, /'
A duplicata é uma combinação de texto de maiúsculas e minúsculas diferentes.
Eu preciso contar o número de duplicatas (sem distinção entre maiúsculas e minúsculas) e, em seguida, preciso remover duplicatas escolhendo caso com a maior duplicata.
Abaixo do exemplo:
hot chocolate
hot chocolate
hot chocolate
Hot Chocolate
Hot Chocolate
Hot Chocolate
Hot Chocolate
Hot Chocolate
Xicolatada
Xicolatada
Xicolatada
Xicolatada
XICOLATADA
XICOLATADA
Deve se tornar:
Hot Chocolate, 8
Xicolatada, 6
Esta pergunta é semelhante a desta mas preciso escolher maiúsculas e minúsculas com maior duplicidade e contar maiúsculas e minúsculas sem distinção.
Eu usaria tolower()
para deixar todos os itens em minúsculas. Então, é uma questão de armazená-los em uma matriz a[]
e, em seguida, imprimir os resultados:
$ awk '{a[tolower($0)]++} END {for (i in a) print i, a[i]}' file
xicolatada 6
hot chocolate 8
Para ter a saída em formato separado por vírgula, adicione -v OFS=,
.
Se essa lista de itens estiver em um arquivo chamado list.txt
, você poderá fazer:
tr '[:upper:]' '[:lower:]' < list.txt | sort | uniq -c
... qual será a saída:
8 hot chocolate
6 xicolatada
POSIXly:
<in dd conv=lcase|LC_ALL=C sort|uniq -c >out
... que imprime ...
8 hot chocolate
6 xicolatada
Ou com ferramentas GNU:
<in LC_ALL=C sort -f|uniq -ic >out
... que imprime ...
8 Hot Chocolate
6 XICOLATADA
Você precisa de um GNU uniq
lá - ou, bem, você precisa de um que suporte a opção case -i
nsensitive, de qualquer forma. Todos os sort
s devem fazer isso com -f
de qualquer maneira.
Isso lhe dará sua saída desejada
use List::Util qw(sum);
my %count;
while (<>) {
chomp;
$count{+lc}{$_}++;
}
$,=", ";
$\="\n";
while (my ($key, $hash) = each %count) {
my @labels = reverse
map { $_->[0] }
sort { $a->[1] <=> $b->[1] }
map { [ $_, $hash->{$_} ] }
keys %$hash;
my $sum = sum values %$hash;
print $labels[0], $sum;
}
Então
$ perl count.pl data.txt
Hot Chocolate, 8
Xicolatada, 6
A ordem da saída é indeterminada.
Tags text-processing awk sed