GNU/Linux >> Znalost Linux >  >> Linux

Efektivně odstranit prvních pár řádků z textového souboru?

  • head /tail bude muset iterovat téměř celý soubor (v závislosti na pozici řádku, kterou zadáte jako parametr).
    Potom zkopírujete výsledek do nového souboru a smažete ten starý.

  • Nejsem si jistý, zda sed bude iterovat celý soubor, ale musíte výsledek zkopírovat do nového souboru a smazat ten starý. I s -i (na místě) vytvoří dočasný soubor pod kapotou, takže platí to samé.

Proč prostě neposunout ukazatel, který ukazuje na první řádek souboru, a nepřesunout jej na řádek, který chceme?

Jak jsme mohli něco takového udělat? Musím dělat v C? Existuje jiný způsob?

Dává to smysl ?? přemýšlím špatně? Pokud ano, proč?

Přijatá odpověď:

Proč prostě neposunout ukazatel, který ukazuje na první řádek souboru, a nepřesunout jej na řádek, který chceme?

Protože neexistuje nic takového jako „ukazatel, který ukazuje na první řádek souboru“.

Základní operace pro úpravu souboru jsou:přepsání rozsahu bajtů (tj. nahrazení části daty stejné délky), připojení (tj. přidání na konec), zkrácení (tj. odstranění z konce).

Většina souborových systémů ukládá soubory do bloků pevné velikosti, kromě toho, že poslední blok může být částečný. Neexistuje žádný způsob, jak upravit data na místě, pokud by úprava změnila velikost toho, co se upravuje, pokud změna není na konci nebo pokud by úprava posunula data o celý počet bloků. Posun dat o celý počet bloků by fungoval pouze shodou okolností a neexistuje žádné rozšířené rozhraní¹, které by to dokázalo.

Nejúčinnějším způsobem odstranění dat na začátku souboru je zkopírovat data, která je třeba zachovat, do nového souboru. Což je přesně to, co tail -n +42 nebo sed '41,$p' udělat.

¹ Moderní systémy Linux mají systémové volání k odstranění části souboru:fallocate(fd, FALLOC_FL_COLLAPSE_RANGE, …) , kterou můžete vyvolat pomocí utility fallocate --collapse-range=… . K dispozici je také FALLOC_FL_INSERT_RANGE a --insert-range . Jsou však omezeny na bloky, což je činí většinou nepoužitelnými pro textové soubory, a nejsou dostupné u všech souborových systémů.

Související:Jak získat velikost záhlaví souboru obrázku tiff?
Linux
  1. Jak odstranit duplicitní řádky uvnitř textového souboru?

  2. Jak odstranit prázdné řádky ze souboru (včetně tabulátoru a mezer)?

  3. Odstranění konkrétních řádků ze souboru v příkazovém řádku Linuxu

  1. Odstraňte prázdné řádky v textovém souboru pomocí grep

  2. Jak odstraním nové řádky z textového souboru?

  3. Odstraňte určitý řádek ze souboru historie Bash

  1. Jak vložit text před první řádek souboru?

  2. Zřetězit čáry na základě prvního znaku dalšího řádku?

  3. Jak extrahovat text z velkého souboru počínaje prvním výskytem řetězce?