¿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
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:
-
tail -r
: invierte el orden de las líneas en su entrada -
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]))'
head -n -1
elimina la primera Y la última línea de mi archivo.txt
, en Ubuntu 14.04.2LTS.head -n -1
dicehead: illegal line count -- -1
head -n -1
funciona con GNU coreutils, ¿tal vez MacOS tenga alguna variante BSD?