Eu tenho um arquivo de entrada FILE1.TXT como abaixo.
11 id1
12
13 AGE = 20
14 NAME = NAME1
15
16 id2
17
18 AGE = 30
19 NAME = NAME2
.
.
.
110 idXYZ
111
112 AGE = AGEXYZ
113 NAME = NAMEXYZ
114
115 idZZZ
116
Quero pesquisar todos os campos que pertencem a um ID específico e obter o valor para NAME
Consegui fazer um loop através de cada ID e formei o comando abaixo para cada ID, conforme necessário.
sed -n '/11/,/14/p' FILE1.TXT | grep NAME | awk -F "= " '{print $2}'
O problema aqui é que eu recebo a saída NAME1 , além disso, também recebo NAMEXYZ .
O que deve ser alterado para que eu receba apenas NAME1, mas não NAMEXYZ ?
Como solução alternativa, os comandos abaixo funcionam.
sed -n '/11/,/14/p' FILE1.TXT | grep NAME | awk -F "= " '{print $2}'|head -1
Existe alguma opção ou estou faltando alguma coisa?
^(random no of spaces)11
?sed -n '/^\s*11 /,/^\s*14 /p'
sed -n '/^11 /,/^14 /p' | awk '/NAME/{print $NF}'
você já tentou isso?Use limites de palavras:
corresponderia
NAME1
e nãoNAME1XYZ
ouXYZNAME1
.Similarmente,
não corresponderia a linhas contendo
111
e142
.EDIT: Parece que os números no arquivo de entrada são realmente números de linha. Se for esse o caso, você poderia simplesmente dizer:
para obter as linhas desejadas.
fonte
NAME
entre as linhas 11 e 14. Então, por que estásed
olhando111
e114
? Como fazê-lo não parecer entre111
e114
?sed
expressão.grep
com-w
bandeira? não é?-w
seria equivalente. Porsed
exemplo,-w
é um pouco diferente.Você pode usar o AWK
Aparecerá linhas entre 13 e 17, em seguida, procure por Nome e, se corresponder, imprimirá a última palavra de
Name = LastWord
fonte
$
antesNR
e isso causou o erro.Você não precisa de nenhuma outra ferramenta para isso,
sed
lidará facilmente com ela inteira.Isso deve fornecer apenas a primeira sequência de caracteres que não sejam espaços em branco após a frase "NAME =" para cada linha na qual essa frase é encontrada entre as linhas 11 e 14 de qualquer arquivo de entrada
sed
é alimentada.fonte
O sed não é a ferramenta certa para este trabalho. Use awk onde você pode especificar o ID que está procurando e imprimir o próximo NAME que aparece.
fonte
versão genérica não baseada no número da linha, mas na referência de identificação
fonte
você pode imprimir as linhas que contêm o padrão correspondente usando sed da seguinte maneira:
-n
- essas opções desativam essa impressão automática e o sed somente produz saída quando explicitamente solicitado através dop
comando.p
- impressãofonte