Awk print next depois da condição correspondente?

0

Ao usar o comando: awk 'f&&!--f;{if(length($1)>8){f=1}}' awk.write , posso imprimir a linha após a linha correspondente.

Eu sei o uso de flags , mas não tenho ideia do que o &&!--f realmente faz?

this line 1 no un1x
this lines 22 0
butbutbut this 33 22 has unix
but not 1
THIS is not
butbutbut ffff
second line
    
por asad 07.01.2016 / 10:52

1 resposta

1

Vamos ver f&&!--f . Aqui, ambas as condições f e !--f precisam ser avaliadas como True, para que a ação padrão (print the line) seja executada. && é o lógico AND .

Uma declaração em awk é verdadeira se for avaliada como algo diferente de 0 . Portanto, a primeira condição é verdadeira se f não for 0 .

!--f significa diminuir f por 1 imediatamente ( f-- também diminui em um, mas apenas um pouco mais tarde, veja esta documentação para detalhes). E ! nega o valor de verdade da instrução anterior. Portanto, se f for 1 , --f se tornará 0 , a.k.a. Falso. O ! torna isso verdadeiro. Isso deve pegar a circunstância se f não for igual a 1 .

Neste exemplo simples, esse segundo teste não é estritamente necessário, mas garante que f seja redefinido para 0 . Uma versão mais curta seria:

awk 'f&&!--f;length($1)>8{f=1}' awk.write

E possivelmente mais fácil de entender:

awk 'f&&{print;f=0};length($1)>8{f=1}' awk.write
    
por 07.01.2016 / 11:05

Tags