Como ler o arquivo linha por linha e imprimir a linha anterior onde o arquivo contém um único token

1

Por exemplo, meu arquivo é 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

Eu preciso imprimir a linha anterior da entrada de token único "10", que deve ser

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

Como posso fazer isso?

    
por nalini 27.06.2014 / 12:16

3 respostas

7

Você pode usar awk :

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

Isso salva todas as linhas do arquivo ( LAST=$0 ) e quando uma linha tem apenas um registro ( NF == 1 - NF é o número de tokens na linha, grosso modo) imprime a linha salvou a linha anterior.

    
por 27.06.2014 / 12:20
2

Se você tiver apenas uma ocorrência do token, poderá fazer isso com o GNU grep e head :

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

O -B 1 informa grep para imprimir a linha correspondente e a anterior. Com a opção -x , grep 10 corresponde a linhas que são e x atly 10 (em oposição a contendo 10 ). Finalmente, o head -n 1 imprime apenas a primeira das linhas resultantes.

    
por 27.06.2014 / 13:04
1

sed

Você pode usar sed :

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

Explicação:

O endereço /^10$/ corresponde à linha que contém 10. Quando corresponde, a seguinte série de comandos é executada, {x;p;} , que troca ( x ) o espaço de armazenamento com o espaço padrão e imprime ( p ) o espaço padrão.

O espaço de espera contém a linha anterior devido ao resto do script. Para cada linha do arquivo, troque ( x ) o espaço de espera com o espaço de padrão e exclua ( d ) o que estiver no espaço de padrão.

Diferentemente do primeiro comando, que possui um prefixo de endereço que faz com que ele corresponda apenas quando a linha 10 é vista, esses comandos não têm prefixo e, portanto, correspondem a cada linha do arquivo. O resultado final é que continuamos colocando a última linha vista no espaço de espera, e o fato de excluirmos o espaço padrão significa que não há saída além de nossa saída explícita quando vemos 10.

    
por 30.06.2014 / 18:16