A linha duplicada de contagem de maiúsculas e minúsculas, remove a duplicata por escolher maiúsculas e minúsculas com maior duplicado

5

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.

    
por apasajja 17.06.2015 / 11:17

5 respostas

6

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]*\) \(.*\)/, /'
    
por 17.06.2015 / 11:34
4

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=, .

    
por 17.06.2015 / 11:20
0

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
    
por 17.06.2015 / 11:21
0

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.

    
por 17.06.2015 / 11:52
0

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.

    
por 17.06.2015 / 17:38