Imprimer le contenu du fichier sans la première et la dernière ligne

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

Réponse

Juste avec sed, sans aucun tuyau:

sed "1d;$d" file.txt 

REMARQUE

  • 1 signifie premier ligne
  • d signifie delete
  • ; est le séparateur de 2 commandes
  • $ signifie dernière ligne

Réponse

Vous navez pas besoin de connaître le nombre de lignes à lavance. tail et head peuvent prendre respectivement un décalage depuis le début ou la fin du fichier.

Ce tube commence à la deuxième ligne du fichier (sautant la première ligne) et sarrête à la dernière mais une (sautant la dernière ligne). Pour ignorer plus dune ligne au début ou à la fin, ajustez les nombres en conséquence.

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

linverse fonctionne de la même manière, bien sûr:

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

Commentaires

  • I don ' t sachez pourquoi, mais head -n -1 supprime la première ET la dernière ligne de mon fichier .txt, sur Ubuntu 14.04.2LTS.
  • Sous MacOS head -n -1 indique que head: illegal line count -- -1
  • head -n -1 fonctionne avec GNU coreutils, peut-être que MacOS a une variante BSD?

Réponse

Voici comment le faire avec awk:

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

Autre moyen également pour sed:

sed "1d;x" file.txt 

x est une commande avancée sed, elle change la ligne actuelle avec le précédent: le courant passe dans le buffer et previou s va à lécran et ainsi de suite pendant que sed traite le flux ligne par ligne (cest pourquoi la première ligne sera vide).

à chaque étape (ligne) met la ligne courante dans la variable et ne commence à limprimer quaprès le passage de la deuxième ligne. Ainsi, nous avons eu une séquence de lignes shitfed sur lécran de la seconde à la dernière. La dernière ligne est omise car la ligne est dans la variable et ne devrait ê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 actuelle.
perl -n est le raccourci pour while(<..>) {..} structure et -e est pour le script en ligne.

Réponse

Pour les utilisateurs Mac:

Sur Mac, head -n -1 ne fonctionne pas. À la place, inversez le fichier, coupez la première ligne, puis inversez-la:

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

Explication:

  1. tail -r: inverse lordre des lignes dans son entrée

  2. tail -n +2: imprime tous les l ines à partir de la deuxième ligne de son entrée

Commentaires

  • Cela échouerait avec head: illegal line count -- -1 pour être exact.

Réponse

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 script.py. Exécutez le script sur le fichier avec lequel vous souhaitez vérifier.

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

Exemple:

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

Commentaires

  • ''.join(list(open("/path/to/file"))[1:-1]): Cela semble être une solution plus simple 🙂 Et si vous avez besoin que cela soit fait directement sur linvite de commande, vous pouvez essayer: python -c 'print("".join(list(open("/path/to/file"))[1:-1]))'

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *