2012-01-29 20 views
7

Czytałem książkę kucharską dla systemu Linux, aby uzyskać zrozumienie. Jestem całkiem nowy w tym.Zgodność z tekstem

Przeszukuję temat o nazwie Konkordancja tekstu. Teraz rozumiem, co to jest, ale nie jestem w stanie uzyskać sekwencji poleceń za pomocą tr, sort i uniq (tak mówi książka kucharska), które generowałyby zgodność.

Czy ktoś może mi powiedzieć, jak stworzyć podstawową zgodność? tj. po prostu sortuj i wyświetlaj częstotliwość słów dla każdego unikalnego słowa.

Pomysł przedstawiony w książce kucharskiej używać tr przetłumaczyć wszystkie spacje na znaki nowego wiersza, tak że każde słowo przechodzi do nowej linii, który jest następnie przekazywany do sortowania, a następnie przekazany do uniq z -c do zliczyć unikalne warunki.

Niestety, nie jestem w stanie określić prawidłowych parametrów. Czy ktoś może wyjaśnić, proszę, wyjaśniając, co robi każdy parametr?

Mam googleed dla tego, ale nie jestem w stanie uzyskać jasno zdefiniowanej odpowiedzi na mój problem.

Każda pomoc jest doceniana!

Odpowiedz

0
tr ' ' '\n' <input | sort | uniq -c 

Jeśli rozumiem komentarz poprawnie, chcesz sumę wszystkich słów nad wszystkie pliki w katalogu. Można to zrobić tak:

find mydir -type f -exec cat {} + | tr ' ' '\n' | sort | uniq -c 

find rekursywnie szukać mydir plików pasujących swoje argumenty: -type f opowiada ją tylko utrzymać normalne pliki (w przeciwieństwie do katalogów lub kilka innych typów nie powinno się martwić się jeszcze), a następnie find wykona cat, podając wszystkie nazwy plików jako argumenty; cat łączy pliki, drukując całą ich zawartość tak, jakby był jednym dużym plikiem. To wyjście następnie przechodzi przez ten sam rurociąg, aby faktycznie obliczyć zgodność.

+0

Muszę teraz biec (dosłownie), ale wyjaśnię, kiedy wrócę, jeśli nikt inny nie zrobi. Tymczasem przeczytaj strony podręcznika. – Kevin

+0

Wielkie dzięki. To działa. Spróbuję ją odtworzyć i zrozumieć. –

+0

OK. Mam to. Jedno pytanie jednak, czy możemy to rozszerzyć, aby uzyskać zgodność niektórych plików w jednym katalogu? Jednym ze sposobów, aby to zrobić, jest zapisanie wyniku pliku "ls" w pliku, a następnie dla każdej linii tego pliku jest nazwa pliku, uruchom powyższe polecenie, aby dołączyć zgodność tego pliku do "wyniku". Następnie ponownie spójrz na "wynik". To działa, ale czy istnieje prostszy, elegancki sposób, aby to osiągnąć? –

1

Istnieje wiele sposobów, aby to zrobić, ale to jest moje rozwiązanie. Używa różnych poleceń niż wspomniałeś, ale dzięki użyciu sed i końcowego `sortowania, może produkować bardziej pożądane wyniki.

find . -type f -print0 | xargs -0 cat | sed 's/[[:punct:]]//g' | sed -r 's/\s+/\n/g' | sort | uniq -c | sort -n 

find . -type f -print0 rekursywnie przeszukać wszystkie foldery i pliki z bieżącego katalogu w dół. -type f spowoduje zwrócenie tylko plików. -print0 będzie używał specjalnego znaku \0, aby kończyć nazwy plików, tak aby spacje nie myliły się z następnym poleceniem w potoku.

xargs pobiera dane wejściowe i zamienia je na argumenty dla polecenia, w tym przypadku cat. cat wydrukuje zawartość wszystkich plików podanych jako argumenty. -0 mówi xargs, że jego dane wejściowe są rozdzielone specjalnym znakiem \0, a nie spacjami.

sed to dopasowujący do wzorca edytor strumieni. Pierwsza komenda sed zastępuje (s) całą interpunkcję za pomocą wzoru [[:punct:]] i zastępuje interpunkcję bez niczego. Pasuje do wszystkich takich wzorców w każdej linii podanej (g).

Druga dana SED włącza wszystkie przypadki: 1 lub więcej pomieszczeń z rzędu (\s+) do nowej linii (\n) przez ciąg wejściowego (g).

sort porządkuje słowa alfabetycznie.

uniq -c eliminuje sąsiednie duplikaty na liście wyników, licząc ile ich było.

sort -n sortuje to wyjście numerycznie, uzyskując listę słów posortowaną według częstotliwości słów.

i xargs są bardzo potężnymi poleceniami, szczególnie jeśli używane są w połączeniu. Ale, jak zauważył inny plakat, find ma również prawie nieokiełznaną moc. tr jest przydatny, ale jest bardziej szczegółowy niż sed.

+0

To jest świetne! Dzięki za lepszą funkcjonalność (nad drugą odpowiedzią). –