Imprime entre as linhas 7-13 que contêm uma certa string (script awk)

0

Estou tentando escrever um script (.awk) que imprima linhas que contenham uma determinada string entre as linhas 7-13. Eu tenho parcialmente trabalhando no entanto, ele imprime todas as linhas que contêm a seqüência de caracteres, em vez de apenas entre 7-13.

#!/usr/bin/awk -f
BEGIN { (NR>=7) && (NR<=13) }
/word/ {print $0}

É provavelmente um erro idiota da minha parte, mas tentei pesquisar em todos os lugares.

a saída ao executar

script.awk filename

é todas as linhas que contêm a palavra

editar:

Depois de experimentar o que Jeff sugeriu, eu entendo isso com a sugestão dele. / agulha / sendo a palavra-chave.

Código Resolvido!

A questão era que eu tinha {print $ 0} em outra linha, acostumada em outros idiomas onde gosto de separar meu código

    
por SheepWaffle 30.10.2018 / 02:19

3 respostas

3

Você colocou a lógica de restrição de linha no bloco "BEGIN", que é executado antes de awk ler qualquer dado. Mova essa lógica para o loop principal:

NR >= 7 && NR <= 13 && /word/ { print }

$0 é o argumento padrão print , se nenhum for dado ... ou, ainda mais curto, como

NR >= 7 && NR <= 13 && /word/

desde que {print} seja a ação padrão, se nenhuma for especificada.
O corpo principal de um script awk é da forma "padrão" "ação"; você quer que o padrão prefixe a ação que você deseja. Aqui, o padrão requer que os três testes sejam verdadeiros e a ação seja imprimir a linha. Colocar o print em uma linha separada significa que não há "ação" ao "passar" os testes e não há "padrão" para imprimir todas as linhas - resultando na impressão de todas as linhas.

    
por 30.10.2018 / 02:26
2

Apenas complementando a resposta de Jeff com uma escrita em sed :

sed -n '7,13 { /expression/ p; }' <file

Isso imprimiria todas as linhas entre as linhas 7 e 13 (inclusive) que correspondem à expressão regular expression . A saída padrão é desativada com -n , então apenas as linhas impressas explicitamente com o comando p serão exibidas.

Uma tradução direta do script sed acima para awk :

awk 'NR == 7, NR == 13 { if (/expression/) print }' <file

A condição NR == 7, NR == 13 deve ser lida como "de qualquer registro de entrada para o qual NR é 7, para qualquer registro de entrada para o qual NR é 13", em que "registro de entrada" por padrão é uma linha e NR é o número de registros (linhas) lidos até o momento.

    
por 30.10.2018 / 15:43
0

Que tal

awk 'NR>6&&NR<14&&/word/' file
    
por 30.10.2018 / 22:02

Tags