Powiedzmy, że mam naprawdę duży plik tekstowy (około 10.000.000 linii). Muszę to grep
zrobić od końca i zapisać wynik w pliku. Jaki jest najbardziej efektywny sposób wykonania zadania?
command-line
sed
awk
grep
efficiency
chaos
źródło
źródło
tac
i,grep
aby osiągnąć to, czego chcesz.grep
ma--max-count (number)
przełącznik, który przerywa określoną liczbę dopasowań, co może być dla ciebie interesujące.Odpowiedzi:
Rozwiązanie tac / grep
Lub nieco bardziej efektywny:
Czas z plikiem 500 MB:
Rozwiązanie sed / grep :
Czas z plikiem 500 MB: Przerwany po ponad 10 minutach.
awk / grep Rozwiązanie:
Czas z plikiem 500 MB:
Rozwiązanie perl / grep :
Czas z plikiem 500 MB:
źródło
sed
,awk
Iperl
(w tej metodzie) nie są w porządku, ponieważ odczytać plik od początku, co jest bardzo nieefektywne. Przypuszczam, żetac
robi to dobrze.< <(tac filename)
Powinien być tak szybki jak potok: w obu przypadkach polecenia są uruchamiane równolegle.tac
grep. Jeśli masz plik 10 000 000 linii, zawierający tylko 2 dopasowania,tac
będziesz musiał odwrócić tylko 2 linie, a nie 10 m.grep
nadal będzie musiał przejść przez to wszystko w jedną stronę.tac
pogrep
, będzie czytać z fajki, więc nie możesz szukać. To sprawi, że będzie mniej wydajna (lub całkowicie zawiedzie), jeśli liczba znalezionych linii jest duża.To rozwiązanie może pomóc:
źródło
tac
to polecenie GNU. W większości innych systemów odpowiednikiem jesttail -r
.tail -r
jest ograniczony do niewielkiej liczby linii, może to być problem.tail -r /etc/passwd
kończy się niepowodzeniemtail: invalid option -- 'r'
. Używam coreutils-8.21-21.fc20.x86_64.tac
(i tylko GNU ma tac) wiele innych Unikówtail -r
. GNUtail
nie obsługuje-r
Ten kończy działanie, gdy tylko znajdzie pierwsze dopasowanie:
Poniżej podano 5 linii przed i po pierwszych dwóch meczach:
Pamiętaj, aby nie używać
-i
(bez rozróżniania wielkości liter), chyba że musisz, ponieważ spowolni to grep.Jeśli znasz dokładny ciąg, którego szukasz, rozważ
fgrep
(Naprawiono ciąg)źródło
Jeśli plik jest naprawdę duży, nie mieści się w pamięci, skorzystam
Perl
z modułu File :: ReadBackwards zCPAN
:Następnie:
źródło
tac
.