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

54

¿Hay alguna manera simple de hacer eco de un archivo, saltando la primera y la última línea? Estaba mirando la tubería desde headadentro tail, pero para aquellos parece que tendría que conocer las líneas totales desde el principio. También estaba mirando split, pero tampoco veo una manera de hacerlo.

usuario394
fuente

Respuestas:

97

Solo con sed, sin tuberías:

sed '1d;$d' file.txt

NOTA

  • 1significa primera línea
  • dsignifica eliminar
  • ; es el separador para 2 comandos
  • $significa la última línea
Gilles Quenot
fuente
36

No necesita saber la cantidad de líneas por adelantado. taily headpuede 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 pero 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
Olaf Dietsche
fuente
No sé por qué, pero head -n -1elimina la primera Y la última línea de mi .txtarchivo, en Ubuntu 14.04.2LTS.
Sopalajo de Arrierez
9

Aquí está cómo hacerlo con awk:

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

También otra forma de sed:

sed '1d;x' file.txt

xes un sedcomando avanzado , cambia la línea actual con la anterior: la corriente pasa al búfer y la anterior va a la pantalla, y así sucesivamente mientras sedprocesa el flujo línea por línea (es por eso que la primera línea estará en blanco).

awkLa solución en cada paso (línea) coloca la línea actual en la variable y comienza a imprimirla solo después de pasar la segunda línea. Por lo tanto, obtuvimos una secuencia de líneas en la pantalla desde la segunda hasta la última, pero una. 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.

Misma idea en el perl:

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

$.representa el número de línea y $_ la línea actual.
perl -nes un atajo para while(<..>) {..}estructura y -ees para script en línea.

torre
fuente
2

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 el script contra el archivo con el que desea verificar.

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

Ejemplo:

$ cat file
foo
apple
banana
bar
$ python3 script.py file
apple
banana
Avinash Raj
fuente
2

Para usuarios de Mac:

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

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íneas a partir de la segunda línea en su entrada

Sarfraaz Ahmed
fuente