Miałem polecenie, które działałoby przez plik tekstowy, policzyło wszystkie wystąpienia słów i wydrukowało je w następujący sposób:
user@box $˜ magic-command-i-forgot | with grep | and awk | sort ./textfile.txt
66: the
54: and
32: I
16: unix
12: bash
5: internet
3: sh
1: GNU/Linux
Więc nie wyszukuje wiersz po wierszu, ale słowo po słowie i robi to dla wszystkich słów, nie tylko dla jednego słowa. Dawno temu znalazłem go gdzieś w Internecie, ale nie mogę go znaleźć ani zapamiętać ...
tr -s
do obsługi wielu spacji, szczególnie w przypadku wcięcia.-g
(--general-numeric-sort
) opcjasort
może być preferowana w niektórych przypadkach. Np. Zachowasort -n
się10\n1 4
tak, jak jest, traktując1 4
jak14
, asort -g
potraktuje to poprawnie jako1 4\n10
.echo "Lorem ipsum dolor sit sit amet et cetera." | tr ' ' '\n' | grep -v "^$" | sort | uniq -c | sort -bnr
Pamiętaj, że jestem początkującym, więc mogę się mylić, nie krępuj się doradzić.Aby podzielić dane wejściowe na słowa, zamień dowolny znak, który uważasz za separator słów, na nowy wiersz.
źródło
Nie używam grep i awk, ale wydaje się, że robi to, co chcesz:
źródło
set -f
) i traktuje interpunkcję jako część słów (które można naprawić niezręcznie, dodając znaki interpunkcyjne doIFS
- powodzenia w próbach obsługi zestawów znaków spoza ASCII). Nie będzie to dobre w przypadku bardzo dużych plików wejściowych, ponieważ przechowuje cały plik w pamięci (sort
jest mądrzejszy).Uważam, że szukasz czegoś takiego?
oczywiście możesz zrobić to samo
awk
:)źródło
Za pomocą
awk/sort/uniq
rozwiązania:źródło
sortuje rosnąco po podzieleniu pliku na słowa.
Prosty grep znajdzie się
fish
wfisheye
, więc musisz wzmocnić polecenie grep, aby zapobiec częściowym dopasowaniom.Zajmuje około 3s dla pliku tekstowego 25k na maszynie od wieków, klasycznego dysku twardego (IDE).
W przypadku większych plików lub często wykonywanych operacji lepsze byłoby podejście z mapą skrótu, ale w przypadku rzadko uruchamianego zadania lub tylko mniejszych plików może być wystarczające.
źródło