
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
- NF
es 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 grep
y head
:
grep -x -B 1 10 file | head -n 1
Le -B 1
indica grep
que se imprima la línea coincidente y la anterior. Con la -x
opción, grep 10
coincidencias en líneas que son x
efectivamente 10
(a diferencia deque contiene 10
). Finalmente, head -n 1
imprime 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.