exibindo dados específicos de um arquivo

3

Eu gostaria de poder, a partir da linha de comando, procurar por um nome e dizer a letra A, B, C, D, E, F aparece abaixo, e o nome, e não o material intermediário. Então, se eu pesquisar por tim, deveria dizer:

B  
tim

Aqui está o arquivo:

A
bob

john

B
tom

tim

C
phil 
bob

D
gary
tony

E
anne
rachel

F
gareth
    
por barlop 07.07.2011 / 02:17

2 respostas

1

Ok, que tal algo mais parecido com isto:

awk "/^[A-Z]\$/{ l=\ ; } ; /^${NAME}\$/ { print l ; exit ; };"

Contras: Envolve a citação (que eu pessoalmente tento evitar) e expressões regulares (que são difíceis de entender) e o awk (que é difícil de entender)

Prós: Eu acho que isso faz o truque, pelo menos do que eu entendo de forma revisada.

(pode ser que não seja necessário substituir $ {NAME} pela entrada que você está pesquisando, por exemplo, tim)

A explicação solicitada na seção de comentários:

/^[A-Z]\$/{ l=\ ; }

Para cada linha que é uma única letra maiúscula, atribua o primeiro (único) item dessa linha à variável l (letra ell).

/^${NAME}\$/ { print l ; exit ; }

Para cada linha que corresponda a $ {NAME} (você deve substituir a coisa que está procurando por $ {NAME}, como eu disse acima, ou definir e exportar a variável de ambiente NAME antes de executar o comando), imprima valor mais recente para a variável l e, em seguida, sair. Efetivamente, o programa sai assim que encontra uma linha que é exatamente o valor especificado, logo após a impressão da linha encontrada mais recentemente que corresponde à primeira expressão regular.

Eu citei todos os $ que não são usados para $ {NAME} porque usei aspas duplas em vez de aspas simples (para permitir que $ {NAME} seja expandido, mas para evitar mexer com os outros $ 's.

    
por 07.07.2011 / 03:53
0
grep -B1 <searchstring> <filename>

Por exemplo

grep -B1 tim file
    
por 07.07.2011 / 02:47