una ultimas ultima reemplazar lineas linea insertar fichero eliminar con caracter borrar linux bash sed text-processing

ultimas - sed linux eliminar linea



sed cómo borrar las primeras 17 líneas y las últimas 8 líneas en un archivo (7)

Tengo un gran archivo CSV de 150GB y me gustaría eliminar las primeras 17 líneas y las últimas 8 líneas. He intentado lo siguiente, pero parece que no está funcionando bien

sed -i -n -e :a -e ''1,8!{P;N;D;};N;ba''

y

sed -i ''1,17d''

Me pregunto si alguien puede ayudar con sed o awk, un trazador de líneas será genial?


Aprendí esto hoy por el caparazón.

{ ghead -17 > /dev/null sed -n -e :a -e ''1,8!{P;N;D;};N;ba'' } < my-bigfile > subset-of

Uno tiene que usar una head no consumidora, de ahí el uso de ghead de los coreutils de GNU.


head y la tail son mejores para el trabajo que sed o awk .

tail -n+18 file | head -n-8 > newfile


LENGTH=`wc -l < file` head -n $((LENGTH-8)) file | tail -n $((LENGTH-17)) > file

Editar: como mtk publicado en el comentario, esto no funcionará. Si desea utilizar wc y hacer un seguimiento de la longitud del archivo, debe usar:

LENGTH=`wc -l < file` head -n $((LENGTH-8)) file | tail -n $((LENGTH-8-17)) > file

o:

LENGTH=`wc -l < file` head -n $((LENGTH-8)) file > file LENGTH=`wc -l < file` tail -n $((LENGTH-17)) file > file

Lo que hace que esta solución sea menos elegante que la publicada por choroba :)


awk -v nr="$(wc -l < file)" ''NR>17 && NR<(nr-8)'' file


Try this : sed ''{[/]<n>|<string>|<regex>[/]}d'' <fileName> sed ''{[/]<adr1>[,<adr2>][/]d'' <fileName>

dónde

  1. /.../=delimiters

  2. n = número de línea

  3. cadena = cadena encontrada en línea

  4. regex = expresión regular correspondiente al patrón buscado

  5. addr = dirección de una línea (número o patrón)

  6. d = borrar

Referir este enlace


Todos awk:

awk ''NR>y+x{print A[NR%y]} {A[NR%y]=$0}'' x=17 y=8 file


Similar a la respuesta de Thor , pero un poco más corto:

sed -i '''' -e $''1,17d;:a/nN;19,25ba/nP;D'' file.txt

El -i '''' le dice a sed que edite el archivo en su lugar. (La sintaxis puede ser un poco diferente en su sistema. Consulte la página de manual).

Si desea eliminar front líneas front desde la parte frontal y la tail desde el final, debe usar los siguientes números:

1,{front}d;:a/nN;{front+2},{front+tail}ba/nP;D

(Los puse en llaves, pero eso es solo un seudocódigo. Tendrás que reemplazarlos por los números reales. Además, debería funcionar con {front+1} , pero no en mi máquina (macOS 10.12). 4). Creo que es un error.)

Trataré de explicar cómo funciona el comando. Aquí hay una versión legible para los humanos:

1,17d # delete lines 1 ... 17, goto start :a # define label a N # add next line from file to buffer, quit if at end of file 19,25ba # if line number is 19 ... 25, goto start (label a) P # print first line in buffer D # delete first line from buffer, go back to start

Primero salteamos 17 líneas. Eso es fácil. El resto es complicado, pero básicamente mantenemos un buffer de ocho líneas. Solo comenzamos a imprimir líneas cuando el búfer está lleno, pero dejamos de imprimir cuando llegamos al final del archivo, por lo que al final, quedan ocho líneas en el búfer que no imprimimos; en otras palabras, los borró