Uzyskaj najczęściej pojawiające się linie z pliku w systemie Linux

11

Mam plik tekstowy zawierający różne słowa w wierszu.
Jak znaleźć 12 najczęściej pojawiających się linii w pliku i wyświetlić je?
Nie jestem zbyt dobry w poleceniach skryptowych.

Gdybym mógł uzyskać polecenie i wyjaśnienie, aby zrozumieć, jak go używać i poszerzyć swoją wiedzę na temat poleceń, byłoby świetnie!

Jim
źródło
stackoverflow.com/questions/16922357/…
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

Odpowiedzi:

21

Możesz to łatwo zrobić za pomocą wbudowanych poleceń.

  • Podaj zawartość pliku sort. Potrzebujemy tego do następnego kroku.
  • To idzie do uniq -c. Policzy niepowtarzalne wystąpienie każdej linii. Jeśli podobne linie nie sąsiadują ze sobą, nie działałoby to bez sortowania wcześniej.
  • Następnie podaj go do innego sort, który sortuje teraz w odwrotnej kolejności ( r) i na podstawie numerycznej ( n) interpretacji danych uniqwyjściowych. Musimy opcję liczbową ponieważ inaczej, przestrzeń przed numerami doprowadziłoby do błędnych wyników (patrz GNU sortpomocy „s dłużej).
  • Na koniec pokaż tylko pierwsze dwanaście linii za pomocą head.

Poleceniem byłoby wtedy:

sort test.txt | uniq -c | sort -rn | head -n 12

Dane wyjściowe zawierają rzeczywistą liczbę wystąpień.

Aby uzyskać tylko nieprzetworzoną listę linii, możesz przesłać dane wyjściowe do sed:

sort test.txt | uniq -c | sort -rn | head -n 12 | sed -E 's/^ *[0-9]+ //g'

Przykład:

I'm not there very often
I'm not there very often
Look at me!
Look at me!
Look at me!
Hello there!
Hello there!
Hello there!
Hello there!
Hello there!
Hello there!

Wyjście z pierwszego polecenia, ale tylko wybierając 2 z head:

6 Hello there!
3 Look at me!

Dane wyjściowe z drugiego polecenia:

Hello there!
Look at me!
slhck
źródło
1
Musisz go posortować przed użyciem uniq.
cyr
@slhck: Dziękuję! Jedno pytanie: sort -rnsortuje w odwrotnej kolejności, używając jako pola sortowania liczby obok każdej wyprodukowanej linii uniq -c? Myślałem, że coś takiego k1lub coś w tym stylu zostanie użyte
Jim
@Jim Dokładnie. rodwraca i nsortuje numerycznie według liczby wyprodukowanej przez uniq. Co dokładnie masz na myśli k1?
slhck 29.01.12
@slhck: Próbowałem rozgryźć te polecenia za pomocą mani zrozumiałem, że -kdo wybrania pola do sortowania należy użyć składni używającej czegoś
Jim
@cYrus: Jaki jest przypadek na krawędzi, który wymaga uprzedniego sortowania?
Jim
3

Jeśli Twoja dystrybucja ma logtop

cat your_file | logtop

Jeśli Twój plik stale rośnie, podobnie jak plik dziennika, spróbuj:

tail -f your_log | logtop
Julien Palard
źródło