Mam problem z wyświetlaniem fragmentów bardzo dużego pliku tekstowego. Ten plik, około 19 GB, jest oczywiście zbyt duży, aby można go było wyświetlić w tradycyjny sposób.
Próbowałem head 1
i tail 1
( head -n 1
i tail -n 1
) obie komendy rurami ze sobą w różny sposób (aby dostać się na kawałek w środku) bez powodzenia. Mój komputer z systemem Linux i systemem Ubuntu 9.10 nie może przetworzyć tego pliku.
Jak obsłużyć ten plik? Moim ostatecznym celem jest udoskonalenie linii 45000000 i 45000100.
split
ułatwić pracę z dużym plikiem.dd
aby uzyskać kawałek, którego szukasz. Na przykładdd if=bigfile of=extractfile bs=1M skip=10240 count=5
wyodrębni 5 MB z pliku, zaczynając od punktu 10 GB.Odpowiedzi:
Powinieneś użyć
sed
.To mówi,
sed
aby wydrukować linie 45000000-45000100 włącznie i wyjść z linii 45000101.źródło
tail+|head
jest szybszy o dobre 10-15%.Utwórz bazę danych MySQL z jedną tabelą, która ma jedno pole. Następnie zaimportuj plik do bazy danych. Ułatwi to wyszukiwanie określonej linii.
Nie sądzę, żeby cokolwiek innego mogło być szybsze (jeśli
head
itail
już zawodzi). W końcu aplikacja, która chce znaleźć linię,n
musi przeszukiwać cały plik, dopóki nie znajdzien
nowych linii. Bez pewnego rodzaju wyszukiwania (przesunięcie indeksu linii do bajtu w pliku) nie można osiągnąć lepszej wydajności.Biorąc pod uwagę, jak łatwo jest utworzyć bazę danych MySQL i zaimportować do niej dane, wydaje mi się, że jest to realne podejście.
Oto jak to zrobić:
/tmp/my_large_file
byłby plikiem, który chcesz przeczytać.Prawidłowa składnia do importowania pliku z wartościami rozdzielanymi tabulatorami w każdym wierszu to:
Kolejną ważną zaletą tego jest to, że jeśli później zdecydujesz się wyodrębnić inny zestaw wierszy, nie musisz czekać godzin ponownie na przetwarzanie (chyba że oczywiście usuniesz bazę danych).
źródło
sed
poniższym poleceniem i zidentyfikowałem moje linie. Ale teraz mam pytanie uzupełniające, dla którego metoda bazy danych może być bardziej odpowiednia. Teraz muszę usunąć kilkaset wierszy z pliku.sed
mógłbym to zrobić. Oczywiście, jeśli masz dane w bazie danych, wyeksportowanie nowego pliku z wybranymi liniami byłoby trywialne.sed
odpowiedź (ponieważ dało mi to natychmiastową przyjemność; -), ale podniosłem głos, ponieważ użyję twojej metody w przyszłości. Doceniam to.FIELDS TERMINATED BY '\n'
doLOAD DATA
linii.Dwa dobre stare narzędzia do dużych plików to
join
isplit
. Możesz użyć podziału z--lines=<number>
opcją cięcia pliku na wiele plików o określonym rozmiarze.Na przykład
split --lines=45000000 huge_file.txt
. Wynikowe części będą w xa, xb itp. Następnie możeszhead
część xb, która zawierałaby żądane linie. Możesz także „połączyć” pliki z powrotem w pojedynczy duży plik.źródło
Masz odpowiednie narzędzia, ale używasz ich nieprawidłowo. Jak już wcześniej odpowiedziano w U&L,
tail -n +X file | head -n Y
(zauważ, że+
) jest 10-15% szybszy niż wsed
przypadku linii Y zaczynających się od X. I wygodnie, nie musisz jawnieexit
proces jak zsed
.źródło