Cómo leer el archivo línea por línea e imprimir la línea anterior donde el archivo contiene un solo token

Cómo leer el archivo línea por línea e imprimir la línea anterior donde el archivo contiene un solo token

Por ejemplo mi archivo es como:

59 6 18 2014 169 7 14 2 7671912 7849744 201 4
60 6 19 2014 170 5 49 2 7671912 7849744 201 5
61 6 20 2014 171 6 8 2 7671912 7849744 201 6
62 6 23 2014 174 5 3 2 7671912 7849744 201 7
63 6 23 2014 174 7 17 2 7671912 7849744 201 8
64 6 24 2014 175 16 13 2 7671912 7849744 201 9
65 6 25 2014 176 8 20 2 7671912 7849744 201 10
10
1 1 49 6 16 2014 7 39 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 2 49 6 17 2014 13 15 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 3 49 6 18 2014 1 38 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 4 49 6 18 2014 7 14 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 5 49 6 19 2014 5 49 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871

Necesito imprimir la línea anterior de la entrada de token único "10", que debería ser

65 6 25 2014 176 8 20 2 7671912 7849744 201 10

¿Cómo puedo hacer esto?

Respuesta1

Puedes usarawk:

awk 'NF == 1 { print LAST } { LAST=$0 }' < datafile

Esto guarda cada línea del archivo ( LAST=$0) a medida que avanza, y cuando una línea tiene solo un registro ( NF == 1- NFes el número de tokens en la línea, en términos generales) imprime la línea anterior guardada.

Respuesta2

Si solo tiene una aparición del token, puede hacer esto con GNU grepy head:

grep -x -B 1 10 file | head -n 1

Le -B 1indica grepque se imprima la línea coincidente y la anterior. Con la -xopción, grep 10coincidencias en líneas que son xefectivamente 10(a diferencia deque contiene 10). Finalmente, head -n 1imprime solo la primera de las líneas resultantes.

Respuesta3

sed

Puedes usar sed:

sed -e '/^10$/{x;p;}' -e 'x;d' < datafile

Explicación:

La dirección /^10$/coincide con la línea que contiene 10. Cuando coincide, se ejecuta la siguiente serie de comandos, {x;p;}que intercambia ( x) el espacio de retención con el espacio de patrón y luego imprime ( p) el espacio de patrón.

El espacio de espera contiene la línea anterior debido al resto del script. Para cada línea del archivo, intercambie ( x) el espacio de retención con el espacio del patrón y luego elimine ( d) lo que esté en el espacio del patrón.

A diferencia del primer comando, que tiene un prefijo de dirección que hace que solo coincida cuando se ve la línea 10, estos comandos no tienen prefijo y, por lo tanto, coinciden en cada línea del archivo. El resultado neto es que seguimos poniendo la última línea vista en el espacio de retención, y el hecho de que eliminamos el espacio del patrón significa que no hay otra salida que nuestra salida explícita cuando vemos 10.

información relacionada