qual é o significado de 1 no final do script awk

14

Eu estava lendo este script awk

awk -F"=" '{OFS="=";gsub(",",";",$2)}1'

Eu quero saber qual é a função de 1 no final dela

    
por user825904 06.02.2013 / 04:18

3 respostas

20

Um programa awk é uma série de pares de ações de condições, estando as condições fora das chaves e as ações incluídas nelas. Uma condição é considerada falsa se for avaliada como zero ou a string vazia, qualquer outra coisa é verdadeira (variáveis não inicializadas são zero ou string vazia, dependendo do contexto, então elas são falsas). Uma condição ou uma ação pode estar implícita; chaves sem uma condição (como a sua começa) são consideradas como tendo uma condição verdadeira e são sempre executadas se forem atingidas, e qualquer condição sem uma ação imprimirá a linha se e somente se a condição for atendida.

O 1 no final do seu script é uma condição (sempre verdadeira) sem ação, portanto, executa a ação padrão para cada linha, imprimindo a linha (que pode ter sido modificada pela ação anterior entre chaves) .

    
por 06.02.2013 / 05:44
5

Eu realmente não gosto desses tipos de atalhos porque ofusca e engana como está sendo analisado. Quando você lê algo como awk -F"=" '{OFS="=";gsub(",",";",$2)}1' , você pode pensar que o 1 está modificando a instrução anterior. Ou você pode pensar que 1 é um alias para {print} , o que não é tecnicamente correto.

Na verdade, 1 é uma instrução completamente separada. Você pode separar as declarações como esta:

awk -F"=" '
{OFS="="; gsub(",",";",$2)}
1
'

Cada formato de declaração do awk é condition {action} . Se não houver {action} , a ação padrão será {print} . (Se não houver condition , a condição padrão será true .)

Então, aqui, 1 é a condição, que sempre é avaliada como true , pois é diferente de zero. O action é omitido, então o padrão {print} é executado. Você pode pensar assim:

awk -F"=" '
{OFS="="; gsub(",",";",$2)}
1!=0 {print}
'
    
por 16.09.2017 / 02:49
3

1 significa imprimir todas as linhas.

A declaração awk é igual à escrita:

awk -F"=" '{OFS="=";gsub(",",";",$2);print $0;}'
    
por 06.02.2013 / 05:36