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