GNU/Linux >> Tutoriels Linux >  >> Linux

Supprimer efficacement les premières lignes d'un fichier texte ?

  • head /tail devra itérer presque tout le fichier (en fonction de la position de la ligne que vous donnez en paramètre).
    Ensuite, vous copiez ce résultat dans un nouveau fichier et supprimez l'ancien.

  • Je ne sais pas si sed itérera l'ensemble du fichier, mais vous devez copier ce résultat dans un nouveau fichier et supprimer l'ancien. Même avec -i (en place) il crée un fichier temporaire sous le capot, donc la même chose s'applique.

Pourquoi ne pas simplement déplacer le pointeur qui pointe vers la première ligne du fichier et le déplacer vers la ligne souhaitée ?

Comment pourrions-nous faire une chose pareille ? Dois-je faire en C? Existe-t-il un autre moyen ?

Cela a-t-il du sens ?? je pense mal? Si oui pourquoi ?

Réponse acceptée :

Pourquoi ne pas simplement déplacer le pointeur qui pointe vers la première ligne du fichier et le déplacer vers la ligne souhaitée ?

Parce qu'il n'y a pas de "pointeur qui pointe vers la première ligne du fichier".

Les opérations de base pour modifier un fichier sont :écraser une plage d'octets (c'est-à-dire remplacer une partie par des données de même longueur), ajouter (c'est-à-dire ajouter à la fin), tronquer (c'est-à-dire supprimer à partir de la fin).

La plupart des systèmes de fichiers stockent les fichiers dans des blocs de taille fixe, sauf que le dernier bloc peut être partiel. Il n'y a aucun moyen de modifier les données en place si la modification changeait la taille de ce qui est modifié, à moins que le changement soit à la fin ou que la modification décale les données d'un nombre entier de blocs. Le déplacement des données d'un nombre entier de blocs ne fonctionnerait que par coïncidence, et il n'y a pas d'interface répandue¹ pour le faire.

Le moyen le plus efficace de supprimer des données au début d'un fichier consiste à copier les données qui doivent être conservées dans un nouveau fichier. C'est précisément ce que tail -n +42 ou sed '41,$p' faire.

¹ Les systèmes Linux modernes ont un appel système pour supprimer une partie d'un fichier :fallocate(fd, FALLOC_FL_COLLAPSE_RANGE, …) , que vous pouvez appeler via l'utilitaire fallocate --collapse-range=… . Il y a aussi FALLOC_FL_INSERT_RANGE et --insert-range . Mais ils sont limités aux blocs, ce qui les rend la plupart du temps inutiles pour les fichiers texte, et ils ne sont pas disponibles avec tous les systèmes de fichiers.

En relation:Comment obtenir la taille de l'en-tête de fichier de l'image tiff ?
Linux
  1. Comment supprimer les lignes en double dans un fichier texte ?

  2. Comment insérer du texte avant la première ligne d'un fichier ?

  3. Supprimer les lignes vides dans un fichier texte via grep

  4. Comment supprimer les retours à la ligne d'un fichier texte ?

  5. Supprimer les lignes paires ou impaires d'un fichier texte

Comment supprimer des lignes d'un fichier à l'aide de la commande Sed

Comment supprimer tous les espaces blancs d'un fichier texte

Comment supprimer les "données binaires" d'un fichier texte (par exemple, Bash_history) ?

Supprimer les lignes d'en-tête supplémentaires du fichier, à l'exception de la première ligne ?

Suppression de lignes spécifiques d'un fichier dans la ligne de commande Linux

Supprimer les N premières lignes d'un fichier journal actif