Edytuj pierwszy wiersz dużego pliku tekstowego

16

Mam ogromny plik tekstowy, o wiele za duży, aby całą tę stronę zapisać w pamięci. Wszystko, co muszę zrobić z tym plikiem tekstowym, to edycja pierwszego wiersza (jest to plik CSV i muszę zmienić tytuły).

Czy istnieje prosty sposób, aby to zrobić w bash?

rysie
źródło
Czy jest jakiś powód, dla którego nie możesz po prostu użyć edytora tekstu?
dangph
Plik jest za duży, ponad 20 razy większy niż moja maksymalna pamięć wirtualna na tym komputerze.
lynks,
1
Słusznie. Miałem wrażenie, że dobrzy redaktorzy tekstu radzą sobie z bardzo dużymi plikami, ponieważ ładują tylko tyle, ile potrzebują do pamięci, ale po przeczytaniu niektórych innych pytań wydaje się, że większość z nich ma z nimi problemy.
dangph
@dangph Prawda ... może być dziwna, ale kilka starych i przestarzałych „edytorów tekstu” (lub tak zwanych) jak edlindla ms-dos lub eddla Uniksa nie wydaje się mieć tego problemu, ale tylko edytory liniowe ... RAM na czasy te były rzadkie i cenne, a rozmiar pliku w gigabajtach był czymś niemożliwym do uwierzenia! ;)
laurent
Żeby wyjaśnić;): NIE tęsknię ed!!! ale w tym przypadku byłoby dobrze (nie jestem pewien, czy poradzi sobie z plikiem tego rozmiaru ...)
laurent

Odpowiedzi:

22

Możesz użyć, lessaby zobaczyć, co chcesz edytować i użyć, sedaby wprowadzić zmiany. W ten sposób edytujesz bez ładowania całego pliku.

Innym sposobem jest podzielenie pliku, edycja i ponowne dołączenie:

split -b 10000k <file>

and to join:

cat xa* > <file>
Laurent
źródło
głosowanie na sed.
atroon
Fantastyczne, podzielone i dołączone było dokładnie tym, czego szukałem, dzięki.
lynks,
Oczywiście sed jest lepszy, ponieważ może łatwo przeszukiwać / zamieniać cały plik, ale jeśli potrzebuje tylko zmienić pierwszą linię, podział nie jest zły i szybszy.
laurent
4
sed zajęłoby wiele godzin, aby uruchomić cały plik (który jest nieco poniżej połowy TB), zmiany były tylko w pierwszej linii, rozdzielenie wydaje się rozsądne.
lynks,
3

Jeśli modyfikacja zmienia długość linii, cały plik musi zostać przepisany, patrz na przykład ta dyskusja na temat SO. Prawdopodobnie powinieneś rozważyć zapisanie danych w bazie danych.

Mając to na uwadze, możesz strumieniowo edytować plik za pomocą sed. Aby zastąpić pierwszy wiersz, wykonaj coś takiego (GNU sed):

< oldfile sed '1c\new_heading' > newfile
Thor
źródło