Necesito encontrar las 10 palabras más frecuentes en un archivo .csv.
El archivo está estructurado para que cada línea contenga palabras separadas por comas. Si la misma palabra se repite más de una vez en la misma línea, debe contarse como una.
Entonces, en el siguiente ejemplo:
green,blue,blue,yellow,red,yellow
red,blue,green,green,green,brown
verde, azul y rojo deben contarse como 2 y amarillo y marrón como 1
Sé que se han hecho preguntas similares antes, y una solución fue:
<file.csv tr -c '[:alnum:]' '[\n*]' | sort|uniq -c|sort -nr|head -10
Pero esto contará el número de veces que aparece una palabra en la misma línea, así:
4 green
3 blue
2 yellow
2 red
1 brown
y esto no es realmente lo que necesito.
¿Alguna ayuda? También agradeceré una breve explicación del comando y por qué el comando que encontré en preguntas similares no hace lo que necesito.
Respuesta aceptada:
Probablemente buscaría perl
- Usar
uniq
de laList::Util
módulo para deduplicar cada fila. - Use un hash para contar las ocurrencias resultantes.
Por ejemplo
perl -MList::Util=uniq -F, -lnE '
map { $h{$_}++ } uniq @F
}{
foreach $k (sort { $h{$b} <=> $h{$a} } keys %h) {say "$h{$k}: $k"}
' file.csv
2: red
2: green
2: blue
1: yellow
1: brown
Si no tiene otra opción que sort
y uniq
coreutils, entonces puede implementar un algoritmo similar con la adición de un bucle de shell
while IFS=, read -a words; do
printf '%s\n' "${words[@]}" | sort -u
done < file.csv | sort | uniq -c | sort -rn
2 red
2 green
2 blue
1 yellow
1 brown
sin embargo, consulte ¿Por qué se considera una mala práctica el uso de un bucle de shell para procesar texto?