Ułóż wszystkie słowa w pliku tekstowym i posortuj wydruk


28

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ć ...

Odpowiedzi:


33

Chciałbym używać trzamiast awk :

echo "Lorem ipsum dolor sit sit amet et cetera." | tr '[:space:]' '[\n*]' | grep -v "^\s*$" | sort | uniq -c | sort -bnr
  • tr po prostu zamienia spacje na nowe linie
  • grep -v "^\s*$" przycina puste linie
  • sort przygotować się jako wkład uniq
  • uniq -c liczyć zdarzenia
  • sort -bnr sortuje w numerycznej odwrotnej kolejności, ignorując spacje

łał. okazało się, że jest to świetne polecenie do liczenia przekleństw na linie

odnaleźć . -name „* .py” -exec cat {} \; | tr '[: space:]' '[\ n *]' | grep -v "^ \ s * $" | sortuj | uniq -c | sort -bnr | kurwa grep


Może być używany tr -sdo obsługi wielu spacji, szczególnie w przypadku wcięcia.
Arcege

@Arcege: Dobra uwaga. Chociaż nie zmieni to wyniku, może nieco poprawić skrypt.
Seler

-g( --general-numeric-sort) opcja sortmoże być preferowana w niektórych przypadkach. Np. Zachowa sort -nsię 10\n1 4tak, jak jest, traktując 1 4jak 14, a sort -gpotraktuje to poprawnie jako 1 4\n10.
Skippy le Grand Gourou,

fajne polecenie, naprawdę zasługuję na głosowanie :)
Noor

@seler Myślę, że możesz uprościć grep i tr tak jak poniżej: echo "Lorem ipsum dolor sit sit amet et cetera." | tr ' ' '\n' | grep -v "^$" | sort | uniq -c | sort -bnrPamiętaj, że jestem początkującym, więc mogę się mylić, nie krępuj się doradzić.
smc

8
  1. Podziel wejście na słowa, po jednym w wierszu.
  2. Posortuj wynikową listę słów (wierszy).
  3. Squash wiele razy.
  4. Sortuj według liczby wystąpień.

Aby podzielić dane wejściowe na słowa, zamień dowolny znak, który uważasz za separator słów, na nowy wiersz.

<input_file \
tr -sc '[:alpha:]' '[\n*]' | # Add digits, -, ', ... if you consider
                             # them word constituents
sort |
uniq -c |
sort -nr

To ładna odpowiedź, ponieważ może obsłużyć przypadek, w którym słowa znajdują się bezpośrednio obok interpunkcji niebędącej wyrazem, którą chcesz zignorować.
David Grayson

5

Nie używam grep i awk, ale wydaje się, że robi to, co chcesz:

for w in `cat maxwell.txt`; do echo $w; done|sort|uniq -c
  2 a
  1 A
  1 an
  1 command
  1 considered
  1 domain-specific
  1 for
  1 interpreter,
  2 is
  1 language.
  1 line
  1 of

1
To nie zadziała, jeśli dane wejściowe zawierają znaki wieloznaczne powłoki (należy dodać set -f) i traktuje interpunkcję jako część słów (które można naprawić niezręcznie, dodając znaki interpunkcyjne do IFS- 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 ( sortjest mądrzejszy).
Gilles „SO- przestań być zły”

2

Uważam, że szukasz czegoś takiego?

$ perl -n -e 'foreach ${k} (split(/\s+/)){++$h{$k}};END{foreach $l (keys(%h)){print "$h{$l}: ${l}\n"}}' /path/to/your/file | sort -n -k 1

oczywiście możesz zrobić to samo awk:)



0
file=/home/stefan/ooxml1.txt
for word in $(sed 's/[^A-Za-z]/ /g' $file | tr " " "\n" | sort -u)
do
  echo -n "$word "
  grep -c $word $file
done | sort -k2 -n 

sortuje rosnąco po podzieleniu pliku na słowa.

Prosty grep znajdzie się fishw fisheye, 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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.