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?


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>

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.