qual é o significado de 1 no final do script awk

19

Eu estava lendo esse script awk

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

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

Randhir Singh
fonte
Você também pode fazerawk -F"=" '{OFS="=";gsub(",",";",$2)}{print}'
GypsyCosmonaut

Respostas:

24

Um awkprograma é uma série de pares condição-ação, estando as condições fora de chaves e as ações incluídas neles. Uma condição é considerada falsa se for avaliada como zero ou a sequência vazia, qualquer outra coisa é verdadeira (variáveis ​​não inicializadas são zero ou sequência vazia, dependendo do contexto, portanto, são falsas). Uma condição ou ação pode ser implícita; chaves sem uma condição (quando a sua começa) são consideradas como uma condição verdadeira e sempre são 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 1final do seu script é uma condição (sempre verdadeira) sem ação; portanto, ele executa a ação padrão para cada linha, imprimindo a linha (que pode ter sido modificada pela ação anterior entre chaves).

Kevin
fonte
7

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', pode pensar que 1está modificando a declaração anterior. Ou você pode pensar que 1é um alias para {print}, o que não é tecnicamente correto.

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

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

Cada formato de instrução awk é condition {action}. Se não houver {action}, a ação padrão é {print}. (Se não for conditiondado, a condição padrão é true.)

Então aqui 1está a condição, que sempre é avaliada, truepois é diferente de zero. O actionomitido, portanto, o padrão {print}é executado. Você pode pensar desta maneira:

awk -F"=" '
{OFS="="; gsub(",",";",$2)}
1!=0 {print}
'
wisbucky
fonte
5

1 significa imprimir todas as linhas.

A declaração awk é a mesma da escrita:

awk -F"=" '{OFS="=";gsub(",",";",$2);print $0;}'
Guru
fonte