Imprimer le contenu du fichier sans les première et dernière lignes


54

Existe-t-il un moyen simple de reproduire un fichier en écho, en sautant la première et la dernière ligne? Je regardais la tuyauterie de headdans tail, mais pour ceux il semble que je devrais connaître les lignes au total , dès le départ. Je regardais aussi split, mais je ne vois pas comment le faire avec cela non plus.

Réponses:


97

Juste avec sed, sans aucun tuyau:

sed '1d;$d' file.txt

REMARQUE

  • 1première ligne moyenne
  • dsignifie supprimer
  • ; est le séparateur pour 2 commandes
  • $signifie dernière ligne

36

Vous n'avez pas besoin de connaître le nombre de lignes à l'avance. tailet headpeut prendre un décalage depuis le début ou la fin du fichier, respectivement.

Ce tuyau commence à la deuxième ligne du fichier (en sautant la première ligne) et s’arrête à l’avant-dernier (en sautant la dernière ligne). Pour sauter plusieurs lignes au début ou à la fin, ajustez les chiffres en conséquence.

tail -n +2 file.txt | head -n -1

faire le contraire, fonctionne de la même façon, bien sûr:

head -n -1 file.txt | tail -n +2

Je ne sais pas pourquoi, mais head -n -1supprime la première ligne ET la dernière ligne de mon .txtfichier, sous Ubuntu 14.04.2LTS.
Sopalajo de Arrierez

9

Voici comment le faire avec awk:

awk 'NR>2 {print t} {t=$0}'

Aussi un autre moyen pour sed:

sed '1d;x' file.txt

xest une sedcommande avancée , elle bascule ligne par ligne avec la précédente: current entre dans la mémoire tampon et précédente va à l’écran, etc. lors du sedtraitement ligne par ligne du flux (c’est pourquoi la première ligne sera vide).

awkLa solution à chaque étape (ligne) place la ligne courante dans la variable et ne commence à l’imprimer qu’après le passage de la deuxième ligne. Ainsi, nous avons eu une séquence de lignes merdique à l’écran de l’avant-dernière position. La dernière ligne est omise car elle se trouve dans la variable et ne doit être imprimée qu'à l'étape suivante, mais toutes les étapes sont déjà terminées et nous ne voyons jamais la ligne à l'écran.

Même idée dans le perl:

perl -ne 'print $t if $.>2 ; $t=$_' file.txt

$.représente le numéro de ligne et $_ la ligne en cours.
perl -nest un raccourci pour la while(<..>) {..}structure et -eest pour le script en ligne.


2

En python je ferais comme ça.

#!/usr/bin/python3
import re
import sys
file = sys.argv[1]
with open(file, 'r') as f:
    L = []
    for line in f:
        line = re.sub(r'\n', r'', line)
        L.append(line)
    print('\n'.join(L[1:-1]))

Collez le code ci-dessus dans un fichier et nommez-le ainsi script.py. Exécutez le script sur le fichier que vous souhaitez vérifier.

python3 script.py /path/to/the/file

Exemple:

$ cat file
foo
apple
banana
bar
$ python3 script.py file
apple
banana

2

Pour les utilisateurs de Mac:

Sur Mac, head -n -1ça ne marche pas. Inversez plutôt le fichier, coupez la première ligne, puis inversez-la:

tail -r file.txt | tail -n +2 | tail -r

Explication:

  1. tail -r : inverse l'ordre des lignes dans son entrée

  2. tail -n +2 : affiche toutes les lignes à partir de la deuxième ligne dans son entrée

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.