Tengo archivos delimitados por tabulaciones con varias columnas. Quiero contar la frecuencia de ocurrencia de los diferentes valores en una columna para todos los archivos en una carpeta y ordenarlos en orden decreciente de conteo (el conteo más alto primero). ¿Cómo podría lograr esto en un entorno de línea de comandos de Linux?
Puede usar cualquier lenguaje de línea de comandos común como awk, perl, python, etc.
bash
command-line
frequency
factor
fuente
fuente
-d,
para delimitar campos por comas o cualquier otro delimitador).cut -f 1 -d ' '
. Muchas gracias. :)El sitio GNU sugiere este agradable script awk, que imprime tanto las palabras como su frecuencia.
Posibles cambios:
sort -nr
(e invertirword
yfreq[word]
) para ver el resultado en orden descendente.freq[3]++
: reemplace 3 con el número de columna.Aquí va:
fuente
Perl
Este código calcula las ocurrencias de todas las columnas e imprime un informe ordenado para cada una de ellas:
Guarde el texto como columnvalues.pl
Ejecútelo como:
perl columnvalues.pl files*
Explicación
En el bucle while de nivel superior:
* Recorre cada línea de los archivos de entrada combinados
* Divide la línea en la matriz @Fields
* Para cada columna, incrementa la estructura de datos de matriz de hashes de resultado
En el bucle for de nivel superior:
* Recorrer la matriz de resultados
* Imprimir el número de columna
* Obtener los valores utilizados en esa columna
* Ordenar los valores por el número de ocurrencias
* Orden secundario basado en el valor (por ejemplo, b vs g vs m vs z)
* Itere a través del hash del resultado, usando la lista ordenada
* Imprima el valor y el número de cada ocurrencia
Resultados basados en los archivos de entrada de muestra proporcionados por @Dennis
.csv entrada
Si sus archivos de entrada son .csv, cambie
/\s+/
a/,/
Ofuscación
En un feo concurso, Perl está particularmente bien equipado.
Este one-liner hace lo mismo:
fuente
Rubí (1.9+)
fuente
each_with_object
, entre otras cosas. En resumen, esto está escrito de manera algo grosera.