Queue inverse / impression de tout sauf des n dernières lignes?

Existe-t-il un moyen (ligne de commande POSIX) d’imprimer la totalité d’un fichier SAUF les n dernières lignes? Cas d’utilisation étant, je vais avoir plusieurs fichiers de taille inconnue, qui contiennent tous un pied de page standard d’une taille connue, que je veux supprimer. Je me demandais s’il existe déjà un utilitaire qui le fait avant de l’écrire moi-même.

La plupart des versions de head (1) – GNU dérivées, en particulier, mais pas celles dérivées de BSD – ont une fonctionnalité pour le faire. Il affichera le haut du fichier sauf la fin si vous utilisez un nombre négatif pour le nombre de lignes à imprimer.

Ainsi:

head -n -10 textfile 

Probablement moins efficace que la méthode “wc” + “faire le calcul” + “queue”, mais plus facile à regarder:

 tail -r file.txt | tail +NUM | tail -r 

NUM est un de plus que le nombre de lignes de fin que vous souhaitez supprimer, par exemple +11 affichera toutes les lignes sauf les 10 dernières. Cela fonctionne sur BSD qui ne supporte pas la syntaxe head -n -NUM .

L’utilitaire principal est votre ami.

De la page de manuel de head :

 -n, --lines=[-]K print the first K lines instead of the first 10; with the leading `-', print all but the last K lines of each file 

Il n’y a pas de commandes standard pour cela, mais vous pouvez utiliser awk ou sed pour remplir un tampon de N lignes et imprimer à partir de la tête une fois qu’il est plein. Par exemple avec awk:

 awk -vn=5 '{if(NR>n) print a[NR%n]; a[NR%n]=$0}' file 

Si le pied de page commence par une ligne cohérente qui n’apparaît pas ailleurs, vous pouvez utiliser sed :

 sed '/FIRST_LINE_OF_FOOTER/q' filename 

Cela imprime la première ligne du pied de page; si vous voulez éviter cela:

 sed -n '/FIRST_LINE_OF_FOOTER/q;p' filename 

Cela pourrait être plus robuste que le comptage de lignes si la taille du pied de page change dans le futur. (Ou il pourrait être moins robuste si la première ligne change.)

Une autre option, si la commande head votre système ne supporte pas head -n -10 , est de pré-calculer le nombre de lignes que vous voulez afficher. Ce qui suit dépend de la syntaxe spécifique à bash:

 lines=$(wc -l < filename) ; (( lines -= 10 )) ; head -$lines filename 

Notez que la syntaxe head -NUMBER est supscope par certaines versions de head pour la compatibilité descendante; POSIX n'autorise que la forme head -n NUMBER . POSIX permet également uniquement à l'argument d'être -n un entier décimal positif; head -n 0 n'est pas nécessairement un no-op.

Une solution compatible POSIX est:

 lines=$(wc -l < filename) ; lines=$(($lines - 10)) ; head -n $lines filename 

Si vous devez gérer d'anciens shells pré-POSIX, vous pouvez envisager ceci:

 lines=`wc -l < filename` ; lines=`expr $lines - 10` ; head -n $lines filename 

N'importe lequel d'entre eux peut faire des choses bizarres si un fichier a 10 lignes ou moins de long.

C’est simple. Vous devez append + au nombre de lignes que vous vouliez éviter.

Cet exemple vous donne toutes les lignes sauf la première 9

queue -n +10 fichier d’entrée

(oui, pas les 10 premiers … parce que cela compte différemment … si vous voulez 10, tapez simplement tail -n 11 fichier entrée)