Cómo eliminar las líneas superior e inferior de un archivo usando sed, awk, etc. en 1 paso

1

Quiero cortar las 13 líneas principales y las últimas 6 líneas de un archivo

Hay varias respuestas en Unix / Linux, pero no me funcionan porque las opciones de uso utilizadas no están disponibles en osx, tac no está disponible, etc.
Si estoy publicando aquí para una q & a que es específica de osx

Ahora mismo estoy usando

$ cat myfile | tail -n+14 | sed '$d' | sed '$d' | sed '$d' | sed '$d' | sed '$d' | sed '$d'

pero estoy buscando un '1 paso al final' más corto.

    
pregunta Michael Durrant 18.08.2015 - 12:31

5 respuestas

1

Prueba de esta manera:

sed '1,13d' filename | head -n -6

El comando sed se puede usar para eliminar un rango de líneas. Aquí 1 y 13 son números de línea mínimos y máximos.

    
respondido por el jherran 18.08.2015 - 13:29
1

Sólo por diversión:

sed -e '1,13d' -e $(($(wc -l <FILE)-6+1)),\$d FILE
Sin embargo,

todavía necesita dos pasadas completas sobre el archivo de entrada.

    
respondido por el nohillside 29.09.2015 - 17:21
1

Puedes hacerlo todo con tail

tail -n+14 FILE | tail -r | tail -n+7 | tail -r
  • El primer tail elimina las 13 líneas principales
  • El segundo tail invierte el orden de la línea
  • El tercer tail elimina las 6 líneas superiores del orden invertido
  • El último tail invierte el orden de línea nuevamente

o con awk (con inspiración de patrix)

awk -v n="$(wc -l FILE)" 'NR > 13 && NR < (n-6+1)' FILE
    
respondido por el fd0 18.08.2015 - 13:22
0

Aquí está mi intento, no tan elegante pero funciona:

cat myFile | tail -n+14 | head -n $[ $(wc -l myFile | awk '{ print $1 }') - 19 ]

Nota: el último 19 es 13 + 6

Es mejor incrustar esto en un script:

#!/bin/bash                                                                                                                                                                                                        

FILE="$1"
HEAD_STRIP="$2"
TAIL_STRIP="$3"

cat $FILE | tail -n+$[$HEAD_STRIP + 1] | head -n $[ $(wc -l $FILE | awk '{ print $1 }') - $[HEAD_STRIP + TAIL_STRIP] ]
    
respondido por el Mateusz Szlosek 18.08.2015 - 13:13
0

Esto funcionará con la versión de tail de OSX:

cat file.txt | tail -n +7 | tail -r | tail -n +14 | tail -r    

Si tienes la versión gnu de head (instalada por: brew install coreutils ) puedes hacerlo:

cat file.txt | tail -n +7 | head -n -13
    
respondido por el sente 29.09.2015 - 15:02

Lea otras preguntas en las etiquetas