GNU/Linux >> Linux Esercitazione >  >> Linux

Rimuovere in modo efficiente le prime due righe da un file di testo?

  • head /tail dovrà iterare quasi l'intero file (a seconda della posizione della riga che dai come parametro).
    Quindi copi quel risultato in un nuovo file ed elimini quello vecchio.

  • Non sono sicuro se sed itererà l'intero file ma è necessario copiare quel risultato in un nuovo file ed eliminare quello vecchio. Anche con -i (al posto) crea un file temporaneo nascosto, quindi vale la stessa cosa.

Perché non spostare semplicemente il puntatore che punta alla prima riga del file e spostarlo sulla riga che vogliamo?

Come potremmo fare una cosa del genere? devo fare in C? C'è un altro modo?

Ha senso ?? sto pensando male? Se si perché?

Risposta accettata:

Perché non spostare semplicemente il puntatore che punta alla prima riga del file e spostarlo sulla riga che vogliamo?

Perché non esiste un "puntatore che punta alla prima riga del file".

Le operazioni di base per modificare un file sono:sovrascrivere un intervallo di byte (cioè sostituire una parte con dati della stessa lunghezza), aggiungere (cioè aggiungere alla fine), troncare (cioè rimuovere dalla fine).

La maggior parte dei filesystem memorizza i file in blocchi di dimensioni fisse, tranne per il fatto che l'ultimo blocco potrebbe essere parziale. Non c'è modo di modificare i dati in atto se la modifica cambia la dimensione di ciò che viene modificato, a meno che la modifica non sia alla fine o la modifica sposti i dati di un numero intero di blocchi. Spostare i dati di un numero intero di blocchi funzionerebbe solo per coincidenza e non esiste un'interfaccia diffusa¹ per farlo.

Il modo più efficiente per rimuovere i dati all'inizio di un file è copiare i dati che devono essere conservati in un nuovo file. Che è esattamente ciò che tail -n +42 o sed '41,$p' fare.

¹ I moderni sistemi Linux hanno una chiamata di sistema per rimuovere una parte di un file:fallocate(fd, FALLOC_FL_COLLAPSE_RANGE, …) , che puoi chiamare tramite l'utilità fallocate --collapse-range=… . C'è anche FALLOC_FL_INSERT_RANGE e --insert-range . Ma sono limitati ai blocchi, il che li rende per lo più inutili per i file di testo e non sono disponibili con tutti i filesystem.

Correlati:come ottenere la dimensione dell'intestazione del file dell'immagine tiff?
Linux
  1. Come rimuovere le righe duplicate all'interno di un file di testo?

  2. Come inserire del testo prima della prima riga di un file?

  3. Come rimuovere le righe vuote da un file (inclusi tabulazione e spazi)?

  4. Eliminazione di righe specifiche da un file nella riga di comando di Linux

  5. Rimuovi le righe vuote in un file di testo tramite grep

Come rimuovere le righe da un file usando il comando Sed

Come rimuovere tutti i caratteri di spazio bianco da un file di testo

lo script bash aggiunge il testo alla prima riga di un file

Rimuovi in ​​modo efficiente le ultime due righe di un file di testo estremamente grande

Rimuove le prime N righe da un file di registro attivo

Come visualizzare determinate righe da un file di testo in Linux?