Tenho arquivos delimitados por tabulação com várias colunas. Desejo contar a frequência de ocorrência dos diferentes valores em uma coluna para todos os arquivos em uma pasta e classificá-los em ordem decrescente de contagem (contagem mais alta primeiro). Como eu faria isso em um ambiente de linha de comando do Linux?
Ele pode usar qualquer linguagem de linha de comando comum, como awk, perl, python etc.
bash
command-line
frequency
fator
fonte
fonte
-d,
para delimitar campos por vírgula ou qualquer outro delimitador).cut -f 1 -d ' '
. Muito obrigado. :)O site GNU sugere este belo script awk, que imprime as palavras e sua frequência.
Possíveis mudanças:
sort -nr
(e inverterword
efreq[word]
) para ver o resultado em ordem decrescente.freq[3]++
- substitua 3 pelo número da coluna.Aqui vai:
fonte
Perl
Este código calcula as ocorrências de todas as colunas e imprime um relatório classificado para cada uma delas:
Salve o texto como columnvalues.pl
Execute-o como:
perl columnvalues.pl files*
Explicação
No loop while de nível superior:
* Loop sobre cada linha dos arquivos de entrada combinados
* Divida a linha na matriz @Fields
* Para cada coluna, incremente a estrutura de dados da matriz de hashes do resultado
No nível superior do loop:
* Loop sobre a matriz de resultados
* Imprime o número da coluna
* Obtenha os valores usados nessa coluna
* Classifique os valores pelo número de ocorrências
* Classificação secundária com base no valor (por exemplo b vs g vs m vs z)
* Iterar através do hash de resultado, usando a lista classificada
* Imprimir o valor e o número de cada ocorrência
Resultados baseados nos arquivos de entrada de amostra fornecidos por @Dennis
entrada .csv
Se seus arquivos de entrada forem .csv, mude
/\s+/
para/,/
Ofuscação
Em uma competição feia, o Perl é particularmente bem equipado.
Este one-liner faz o mesmo:
fonte
Ruby (1.9+)
fonte
each_with_object
, entre outras coisas. Resumindo, isso está escrito de maneira grosseira.