Tengo un archivo con 200 líneas.
Necesito extraer líneas del 10 al 100 y colocarlas en un archivo nuevo.
¿Cómo se hace esto en Unix/Linux?
¿Cuáles son los posibles comandos que podría utilizar?
Respuesta1
Usarsed:
sed -n -e '10,100p' input.txt > output.txt
sed -n
medionoimprime cada línea de forma predeterminada. -e
significa ejecutar el siguiente argumento como un script sed. 10,100p
es un script sed que significa comenzar en la línea 10, hasta la línea 100 (inclusive), imprimir ( p
) esa línea. Luego la salida se guarda en output.txt
.
Si su archivo es más largo de lo sugerido, esta versión (sugerida en los comentarios) será más rápida:
sed -e '1,9d;100q'
Eso significaborrarlíneas 1-9,abandonardespués de la línea 100 e imprima el resto. Para 200 líneas no importará, pero para 200.000 líneas la primera versión seguirá mirando cada línea incluso cuando nunca las imprima. En general, prefiero la primera versión por ser explícita, pero con un archivo largo será mucho más rápido: usted conoce mejor sus datos.
Alternativamente, puedes usar head
y tail
en combinación:
tail -n +10 input.txt | head -n 91 > output.txt
Esta vez, tail -n +10
imprime el archivo completo a partir de la línea 10 e head -n 91
imprime las primeras 91 líneas (hasta la línea 100 inclusive del archivo original). Se redirige a output.txt
de la misma manera.
Respuesta2
esto debería hacer
tail -n +10 file.txt | head -n 91 > newfile.txt
Respuesta3
Si hicieras esto en vim
, sería bastante simple. Suponga que su archivo tiene un nombre src
y el archivo al que desea mover las líneas es dest
. Si dest
aún no existe, lo crearías:
touch dest
Luego, abra ambos src
y dest
en vim
(la -p
bandera abre los argumentos en pestañas):
vim -p src dest
Salta a la décima línea; seleccione todo, desde la línea 10 hasta la línea 100; tirón; cambie a la pestaña que contiene dest
; pegar.
10ggv101ygtp
Nota: 101
selecciona al principio de la línea 101 (capta \n
al final de la línea 100).
Obviamente, este es un proceso un poco más complicado que usar una herramienta de línea de comandos, pero tiene la ventaja de brindarte una selección visual (para que puedas estar seguro de que obtienes todo lo que deseas). Sin embargo, este también parece un buen caso de uso para awk
:
awk 'NR==10, NR==100' src > dest
La NR
variable le permite comparar patrones con el número de líneas. Por lo tanto, el comando anterior extrae las líneas 10 a 100 src
y luego su shell redirige la salida a dest
.
Respuesta4
Puedes hacerlo de muchas maneras.
Una awk
solución:
$ awk 'NR<10{next};1;NR>100{exit}' file > new_file
Una perl
solución:
$ perl -nle '
print if $. > 9 and $. < 101;
exit if $. > 100;
' file > new_file