AWK - Adicionar variável e resultado da função à variável

1

Eu quero adicionar variável e resultado da função no AWK. Entrada:

t t t t
a t a ta
ata ta a a

Script:

{
key="t"
print gsub(key,"")#<-it's work
b=b+gsub(key,"")#<- it's something wrong
}
END{
print b}#<-so this is 0

Saída:

4
2
2
0#<-the last print
    
por diego9403 31.08.2015 / 13:10

2 respostas

2

O problema com o seu código, como Brandon Xavier apontou , é que gsub não corresponde apenas a contagem ; na verdade, substitui-os. Então, por exemplo,

{
    print
    print gsub("t", "")
    print
    print gsub("t", "")
    print
    print "----------"
}

imprimiria

t t t t
4

0

----------
a t a ta
2
a  a a
0
a  a a
----------
ata ta a a
2
aa a a a
0
aa a a a
----------

Se você não se importar em corromper seus dados de entrada (ou seja, se contar o t s é a única coisa que você quer fazer com eles), você pode usar a sugestão de Brandon:

{
    x = gsub("t", "")
    print x
    b=b+x
}
END {print b}

O acima é, sem dúvida, a melhor resposta, na medida em que elimina suas chamadas gsub redundantes. (As abordagens a seguir ainda usam duas chamadas para gsub .)

Se você quiser evitar adicionar uma nova variável, você pode fazer isso fazendo a substituição não-destrutiva:

{
    key="t"
    print gsub(key, key)
    b=b+gsub(key, key)
}
END {print b}

, por exemplo, substitua os t s por si mesmos, então eles ainda estão lá quando você faz o segundo gsub . (Você também pode usar gsub(key, "&") para substituir key por si mesmo.)

Outra abordagem é fazer com que o primeiro gsub modificar algo diferente da linha de entrada real:

{
    temp=$0
    print gsub("t", "", temp)
    b = b + gsub("t", "")
}
END {print b}
    
por 31.08.2015 / 20:09
3

O gsub não conta apenas as ocorrências, ele as substitui. A primeira declaração de impressão que você tem lá (presumivelmente para depuração) está quebrando-a.

    
por 31.08.2015 / 14:03

Tags