2012-08-08 9 views
6

Lo siento mucho por esta otra pregunta novato, pero realmente no puedo entender lo que está sucediendo aquí. Quiero calcular la frecuencia de las palabras de un archivo, donde las palabras son una por línea. El archivo es muy grande, por lo que este podría ser el problema (que cuenta 300k líneas en este ejemplo)¿Por qué no está trabajando uniq en este gran archivo? bash

hago este comando:

cat .temp_occ | uniq -c | sort -k1,1nr -k2 > distribution.txt 

y el problema es que me da un pequeño error: se me considera las mismas palabras que diferentes. Por ejemplo las primeras entradas son:

306 continua 
278 apertura 
211 eventi 
189 murah 
182 giochi 
167 giochi 

con giochi repite dos veces como se puede ver

en la parte inferior del archivo se vuelve aún peor y se ve así:

1 win 
    1 win 
    1 win 
    1 win 
    1 win 
    1 win 
    1 win 
    1 win 
    1 win 
    1 winchester 
    1 wind 
    1 wind 

para todas las palabras

Realmente lo siento de nuevo por la estúpida pregunta, pero soy un poco novato con la programación de shell. ¿Qué estoy haciendo mal?

muchas gracias

+1

uso inútil de gato. – scai

Respuesta

12

intenta ordenar primero:

cat .temp_occ | sort| uniq -c | sort -k1,1nr -k2 > distribution.txt 
+1

Me siento estúpido, muchas gracias y lo siento nuevamente por la pregunta de novato – Epi

1

¿Es posible que algunas de las palabras tienen espacios en blanco después de ellos? Si es así debe eliminar el uso de algo como esto:

cat .temp_occ | tr -d ' ' | uniq -c | sort -k1,1nr -k2 > distribution.txt 
+0

No, ya lo he comprobado, antes de publicarlo. Esto es lo que también pensé, pero los espacios en blanco son iguales en todas las palabras. La solución para usar ordena también antes de que el uniq funcionara como un amuleto. Gracias por la ayuda :) – Epi

2

El tamaño del archivo no tiene nada que ver con lo que está viendo. From the man page of uniq(1):

Nota: 'uniq' no detecta las líneas repetidas a menos que sean adyacentes. Es posible que desee ordenar la entrada primero, o use 'ordenar -u' sin 'uniq'. Además, las comparaciones cumplan con las reglas especificadas por 'LC_COLLATE'.`

Entonces, ejecutar uniq en

a 
b 
a 

devolverá:

a 
b 
a 
Cuestiones relacionadas