371 votes

Bash - supprime la dernière ligne d'un fichier

J'ai un dossier, foo.txt contenant les lignes suivantes :

a
b
c

Je veux une commande simple qui donne comme résultat le contenu de foo.txt être :

a
b

473voto

thkala Points 36148

Utilisation de GNU sed :

sed -i '$ d' foo.txt

Le site -i L'option n'existe pas dans les anciennes versions, vous devez donc l'utiliser comme un filtre avec un fichier temporaire :

cp foo.txt foo.txt.tmp
sed '$ d' foo.txt.tmp > foo.txt
rm -f foo.txt.tmp

Bien sûr, dans ce cas, vous pourriez aussi utiliser head -n -1 au lieu de sed .

315voto

John Points 591

C'est de loin la solution la plus rapide et la plus simple, surtout pour les gros fichiers :

head -n -1 foo.txt > temp.txt ; mv temp.txt foo.txt

si vous voulez supprimer la ligne supérieure, utilisez ceci :

tail -n +2 foo.txt

ce qui signifie que les lignes de sortie commencent à la ligne 2.

Ne pas utiliser sed pour effacer les lignes du haut ou du bas d'un fichier -- c'est très très lent si le fichier est gros.

136voto

Yossi Farjoun Points 438

J'ai eu des difficultés avec toutes les réponses ici parce que je travaillais avec un fichier ENORME (~300Gb) et aucune des solutions n'était adaptée. Voici ma solution :

dd if=/dev/null of=<filename> bs=1 seek=$(echo $(stat --format=%s <filename> ) - $( tail -n1 <filename> | wc -c) | bc )

En d'autres termes : déterminez la longueur du fichier que vous souhaitez obtenir (longueur du fichier moins la longueur de sa dernière ligne) et, à l'aide de dd, définissez cette position comme étant la fin du fichier.

NOTE : Ceci supprime la ligne du fichier en place ! Faites une sauvegarde ou un test sur un fichier factice avant de l'essayer sur votre propre fichier énorme !

13voto

lhf Points 30556

echo -e '$d\nw\nq'| ed foo.txt

9voto

Foo Bah Points 11566
awk 'NR>1{print buf}{buf = $0}'

Essentiellement, ce code dit ce qui suit :

Pour chaque ligne après la première, imprimer la ligne mise en mémoire tampon

pour chaque ligne, réinitialiser le tampon

Le tampon est décalé d'une ligne, donc vous finissez par imprimer les lignes 1 à n-1.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X