Imprimir el contenido del archivo sin la primera y la última línea

¿Existe una forma sencilla de hacer eco de un archivo omitiendo la primera y la última línea? Estaba mirando la tubería desde head a tail, pero para ellos parece que tendría que saber el total de líneas desde el principio. También estaba mirando split, pero tampoco veo la forma de hacerlo con eso.

Respuesta

Solo con sed, sin tuberías:

sed "1d;$d" file.txt 

NOTA

  • 1 significa primero línea
  • d significa delete
  • ; es el separador de 2 comandos
  • $ significa última línea

Respuesta

No es necesario que conozca el número de líneas de antemano. tail y head pueden tomar un desplazamiento desde el principio o el final del archivo respectivamente.

Esta tubería comienza en la segunda línea del archivo (omitiendo la primera línea) y se detiene en la última menos una (omitiendo la última línea). Para omitir más de una línea al principio o al final, ajuste los números en consecuencia.

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

hacerlo al revés, funciona igual, por supuesto:

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

Comentarios

  • No ' t sé por qué, pero head -n -1 elimina la primera Y la última línea de mi archivo .txt, en Ubuntu 14.04.2LTS.
  • En MacOS head -n -1 dice head: illegal line count -- -1
  • head -n -1 funciona con GNU coreutils, ¿tal vez MacOS tenga alguna variante BSD?

Respuesta

Aquí se explica cómo hacerlo con awk:

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

También otra forma de sed:

sed "1d;x" file.txt 

x es un comando avanzado sed, cambia la línea actual con el anterior: la corriente entra en el búfer y la anterior s va a la pantalla y así sucesivamente mientras sed procesa el flujo línea por línea (por eso la primera línea estará en blanco).

awk solución en cada paso (línea) coloca la línea actual en la variable y comienza a imprimirla solo después de que se pasa la segunda línea. Por lo tanto, obtuvimos una secuencia de líneas cagadas en la pantalla desde el segundo hasta el último menos uno. La última línea se omite porque la línea está en la variable y debe imprimirse solo en el siguiente paso, pero todos los pasos ya se agotaron y nunca vemos la línea en la pantalla.

La misma idea en perl:

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

$. representa el número de línea y $_ para la línea actual.
perl -n es un acceso directo para while(<..>) {..} estructura y -e es para secuencia de comandos en línea.

Respuesta

Para usuarios de Mac:

En Mac, head -n -1 no funciona. En su lugar, invierta el archivo, corte la primera línea y luego inviértalo:

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

Explicación:

  1. tail -r: invierte el orden de las líneas en su entrada

  2. tail -n +2: imprime todas las l ines a partir de la segunda línea en su entrada

Comentarios

  • Fallaría con head: illegal line count -- -1 para ser exactos.

Respuesta

En Python me gustaría hacer esto.

#!/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])) 

Pegue el código anterior en un archivo y asígnele el nombre script.py. Ejecute la secuencia de comandos en el archivo que desea verificar.

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

Ejemplo:

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

Comentarios

  • ''.join(list(open("/path/to/file"))[1:-1]): Esta parece ser una solución más simple 🙂 Y si necesita que se haga en el símbolo del sistema directamente, entonces puede probar: python -c 'print("".join(list(open("/path/to/file"))[1:-1]))'

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *