Classificação de arquivos pela frequência de “conteúdo da linha” - imprimir duplicados

-1

Imagine que existe um arquivo -

a
b
b
b
b
c
c
d
d
d

Eu quero que a saída seja classificada com base na frequência (eu também quero que as linhas duplicadas sejam impressas) como -

b
b
b
b
d
d
d
c
c
a
    
por GeekyGeek 25.08.2018 / 21:23

2 respostas

3

O seguinte fará o que você quiser ... embora haja muitas outras maneiras de conseguir isso ... por exemplo, com gawk , de acordo com a resposta de Kamil.

  • O primeiro sort solicitará os dados por dados de linha
  • uniq -c contará o número de ocorrências correspondentes (elas devem ser vizinhas)
  • sort -nr classificará pelo número de ocorrências, na ordem inversa
  • O loop while itera em cada linha
    • read n l ingerirá a contagem em n e os dados da linha em l
  • O loop for itera n times
  • echo "${l}" gera os dados da linha
(
    sort \
        | uniq -c \
        | sort -nr \
        | while read n l; do \
            for i in $(seq ${n}); do \
                echo "${l}"; \
            done; \
        done
) <<"EOF"
a
b
b
b
b
c
c
d
d
d
EOF
    
por 25.08.2018 / 22:59
3

Com o GNU Awk:

gawk '
   { arr[$0]++ }
   END {
        PROCINFO["sorted_in"] = "@val_num_desc"
        for (ln in arr) for (i = 1; i <= arr[ln]; i++) print ln
       }
   '

O truque é usar uma matriz e @val_num_desc . Cada linha encontrada se torna um índice, o valor associado é aumentado toda vez que a linha aparece. No final, analisamos o array inteiro em uma ordem específica:

"@val_num_desc"
[…] the element values, treated as numbers, are ordered from high to low.

source

Portanto, o (primeiro)% externofor é responsável por recuperar linhas e suas freqüências na ordem desejada; o interior (segundo) for é apenas para imprimir a linha selecionada atualmente o número correto de vezes.

Nota:

  • Todo personagem é importante. Uma linha e a mesma linha com um espaço extra são diferentes.
por 26.08.2018 / 00:39