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
/.../=delimiters
n = número de línea
cadena = cadena encontrada en línea
regex = expresión regular correspondiente al patrón buscado
addr = dirección de una línea (número o patrón)
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ó