Mam bardzo duży plik (~ 400 GB) i muszę z niego usunąć ostatnie 2 linie. Próbowałem użyć sed
, ale działało to przez wiele godzin, zanim się poddałem. Czy istnieje na to szybki sposób lub utknąłem sed
?
linux
sed
text-manipulation
Russ Bradberry
źródło
źródło
head -n -2 file
Odpowiedzi:
Nie próbowałem tego na dużym pliku, aby zobaczyć, jak to jest szybkie, ale powinno być dość szybkie.
Aby użyć skryptu do usunięcia wierszy z końca pliku:
Szuka do końca pliku, sprawdza, czy ostatni znak jest nową linią, a następnie odczytuje każdy znak po kolei, cofając się, aż znajdzie trzy nowe linie i obcina plik zaraz po tym punkcie. Zmiana została wprowadzona.
Edycja: Dodałem wersję Python 2.4 na dole.
Oto wersja dla Python 2.5 / 2.6:
Oto wersja Python 3:
Oto wersja Python 2.4:
źródło
możesz spróbować GNU head
źródło
head: illegal line count -- -2
Widzę, że moje systemy wyciskania / testowania Debiana (ale nie Lenny / stable) zawierają polecenie „obcinania” jako część pakietu „coreutils”.
Dzięki niemu możesz po prostu zrobić coś takiego
aby usunąć 160 bajtów z końca pliku (oczywiście musisz dokładnie ustalić, ile znaków musisz usunąć).
źródło
dd
zrobi to prosty skrypt (musisz określić przesunięcie wejściowe, aby uzyskać np. Ostatni kilobajt, a następnie użyćtail -2 | LANG= wc -c
, lub coś takiego).tail
jest również skuteczny w przypadku dużych plików - można go użyćtail | wc -c
do obliczenia liczby bajtów do przycięcia.Problem z sed polega na tym, że jest to edytor strumieniowy - przetworzy cały plik, nawet jeśli chcesz wprowadzać modyfikacje tylko pod koniec. Niezależnie od tego, tworzysz nowy plik 400 GB, linia po linii. Każdy edytor działający na całym pliku prawdopodobnie będzie miał ten problem.
Jeśli znasz liczbę wierszy, możesz użyć
head
, ale ponownie tworzy to nowy plik zamiast zmieniać istniejący. Wydaje mi się, że możesz uzyskać wzrost prędkości dzięki prostocie akcji.Państwo może mieć więcej szczęścia przy użyciu
split
złamać plik na mniejsze kawałki, edytując ostatni, a następnie za pomocącat
połączyć je ponownie, ale nie jestem pewien, czy to będzie lepiej. Użyłbym raczej liczby bajtów niż linii, w przeciwnym razie prawdopodobnie nie będzie to wcale szybsze - nadal będziesz tworzyć nowy plik 400 GB.źródło
Wypróbuj VIM ... Nie jestem pewien, czy to zrobi, czy nie, ponieważ nigdy nie użyłem go na tak dużym pliku, ale użyłem go na mniejszych większych plikach w przeszłości, spróbuj.
źródło
Jakiego rodzaju plik iw jakim formacie? Może być łatwiejsze w użyciu coś takiego jak Perl w zależności od rodzaju pliku - tekst, grafika, plik binarny? Jak jest sformatowany - CSV, TSV ...
źródło
Jeśli znasz rozmiar pliku do bajtu (powiedzmy 400000000160) i wiesz, że musisz usunąć dokładnie 160 znaków, aby usunąć dwa ostatnie wiersze, to coś w rodzaju
powinien załatwić sprawę. Minęły wieki, odkąd użyłem dd w gniewie; Wydaje mi się, że pamiętam, że rzeczy idą szybciej, jeśli używasz większego rozmiaru bloku, ale to, czy możesz to zrobić, zależy od tego, czy linie, które chcesz upuścić, są w dobrym wielokrotności.
dd ma kilka innych opcji wypisywania rekordów tekstowych do ustalonego rozmiaru, które mogą być przydatne jako wstępne przejście.
źródło
Jeśli polecenie „obcinania” nie jest dostępne w twoim systemie (patrz moja inna odpowiedź), spójrz na „obcinanie man 2” dla wywołania systemowego w celu obcinania pliku do określonej długości.
Oczywiście musisz wiedzieć, do ilu znaków musisz obciąć plik (rozmiar minus długość problemu dwie linie; nie zapomnij policzyć znaków cr / lf).
I wykonaj kopię zapasową pliku, zanim spróbujesz!
źródło
Jeśli wolisz rozwiązania w stylu uniksowym, możesz zapisać i interaktywne obcinanie linii za pomocą trzech linii kodu (testowane na komputerach Mac i Linux).
małe + bezpieczne obcinanie linii w stylu uniksowym (prosi o potwierdzenie):
To rozwiązanie opiera się na kilku popularnych narzędziach uniksowych, ale nadal stosuje się je
perl -e "truncate(file,length)"
jako najbliższą zamiennik dlatruncate(1)
, który nie jest dostępny we wszystkich systemach.Możesz także skorzystać z następującego kompleksowego programu powłoki wielokrotnego użytku, który zawiera informacje o użytkowaniu oraz funkcje potwierdzania obcięcia, analizy opcji i obsługi błędów.
kompleksowy skrypt obcięcia linii :
Oto przykład użycia:
źródło
zmiany są wprowadzane. Jest to prostsze i bardziej wydajne niż skrypt Pythona.
źródło
ed
zajęło 100 razy więcej czasu niż wykonanie skryptu w języku Python. Mogę sobie tylko wyobrazić, o ile większa byłaby różnica dla pliku OP, który jest 7000 razy większy.Zmodyfikowano zaakceptowaną odpowiedź, aby rozwiązać podobny problem. Można go trochę ulepszyć, aby usunąć n linii.
I odpowiedni test:
źródło
Możesz używać Vima w trybie Ex:
-,
wybierz ostatnie 2 linied
kasowaćx
Zapisz i zamknijźródło