2012-08-08 16 views
6

Mi dispiace davvero per quest'altra domanda di noob, ma non riesco a capire cosa sta succedendo qui. Voglio calcolare la frequenza delle parole da un file, dove le parole sono una per riga. Il file è davvero grande, quindi questo potrebbe essere il problema (conta 300k linee in questo esempio)Perché non funziona uniq su questo grande file? bash

faccio questo comando:

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

e il problema è che mi dà un piccolo bug: si mi considera le stesse parole come diverse. Per esempio le prime voci sono:

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

con giochi ripetuto due volte, come si può vedere

alla fine del file diventa ancora peggiore e sembra che questo:

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

per tutte le parole

Sono davvero dispiaciuto di nuovo per la domanda stupida, ma sono un po 'noob con la programmazione della shell. Cosa sto sbagliando?

grazie mille

+1

uso inutile di cat. – scai

risposta

12

tenta di ordinare prima:

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

Mi sento stupido, grazie mille e scusa ancora per la domanda noob – Epi

1

E 'possibile che alcune delle parole hanno spazi bianchi dopo di loro? Se è così dovresti rimuoverli usando qualcosa del genere:

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

No, l'ho già controllato prima di postare. Questo era quello che pensavo anch'io, ma gli spazi bianchi sono gli stessi in tutte le parole. La soluzione da usare ordina anche prima che l'uniq funzionasse come un incantesimo. Grazie per l'aiuto :) – Epi

2

La dimensione del file non ha nulla a che vedere con quello che stai vedendo. From the man page of uniq(1):

Nota: 'uniq' non rileva linee ripetute se non sono adiacenti. È possibile ordinare prima l'input o usare 'sort -u' senza 'uniq'. Inoltre, i confronti onorano le regole specificate da 'LC_COLLATE'.`

Quindi, in esecuzione su uniq

a 
b 
a 

restituirà:

a 
b 
a 
Problemi correlati