2012-08-08 15 views
6

Naprawdę przepraszam za to inne pytanie noob, ale nie mogę naprawdę dowiedzieć się, co się tutaj dzieje. Chcę obliczyć częstotliwość słów z pliku, gdzie słowa są po linii. Plik jest naprawdę duży, więc to może być problem (liczy 300K linii w tym przykładzie)Dlaczego nie działa funkcja uniq na tym dużym pliku? bash

zrobić tego polecenia:

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

i problemem jest to, że daje mi trochę błąd: to uważa mnie za te same słowa, co różne. Na przykład pierwsze pozycje:

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

z giochi powtórzono dwukrotnie jak widać

na dole pliku staje się jeszcze gorzej, a wygląda to tak:

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

dla wszystkich słów

Naprawdę bardzo mi przykro z powodu głupiego pytania, ale jestem trochę noob z programowaniem powłoki. Co robię źle?

thanks a lot

+1

Useless wykorzystanie kota. – scai

Odpowiedz

12

Spróbuj uporządkować pierwszy:

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

Czuję się głupio, bardzo dziękuję i znów przepraszam za pytanie nooba – Epi

1

Czy to możliwe, że niektóre słowa mają whitespace znaków po nich? Jeśli tak, powinieneś je usunąć za pomocą czegoś podobnego:

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

Nie, już to sprawdziłem, przed wysłaniem. Ja też tak uważałem, ale białe spacje są takie same we wszystkich słowach. Rozwiązanie, którego należy użyć, również przed uniq działało jak urok. Dzięki za pomoc :) – Epi

2

Rozmiar pliku nie ma nic wspólnego z tym, co widzisz. From the man page of uniq(1):

Uwaga: 'uniq' nie wykrywa powtarzające się linie, chyba że są w sąsiedztwie. Możesz najpierw posortować dane wejściowe, lub użyć "sort -u" bez "uniq". Również porównania szanować zasad określonych przez „LC_COLLATE'.`

Więc systemem uniq na

a 
b 
a 

powróci:

a 
b 
a 
Powiązane problemy