Do meu entendimento, $1
é o primeiro campo. Mas estranhamente, awk '$1=$1'
omite espaços extras.
$ echo "$string"
foo foo bar bar
$ echo "$string" | awk '$1=$1'
foo foo bar bar
Por que isso está acontecendo?
Do meu entendimento, $1
é o primeiro campo. Mas estranhamente, awk '$1=$1'
omite espaços extras.
$ echo "$string"
foo foo bar bar
$ echo "$string" | awk '$1=$1'
foo foo bar bar
Por que isso está acontecendo?
Quando atribuímos um valor a uma variável de campo, ou seja. valor de $ 1 é atribuído ao campo $ 1, awk na verdade reconstrói seu $ 0 concatenando-os com o espaço delimitador de campo padrão (ou OFS).
podemos obter o mesmo caso nos seguintes cenários também ...
Para GNU AWK este comportamento está documentado aqui:
https://www.gnu.org/software/gawk/manual/html_node/Changing-Fields.html
faz com que o AWK avalie
$1=$1
, que atribui o campo a si mesmo e tem o efeito colateral de reavaliar$0
; então o AWK considera o valor da expressão e, por ser diferente de zero e não vazio, ele executa a ação padrão, que é imprimir$0
.Os espaços extras são removidos quando o AWK é reavaliado
$0
: ele faz isso concatenando todos os campos usandoOFS
como separador, e esse é um único espaço por padrão. Quando o AWK analisa um registro,$0
contém o registro inteiro, como está, e$1
contém$NF
os campos, sem os separadores; quando qualquer campo é atribuído,$0
é reconstruído a partir dos valores do campo.A saída do AWK neste exemplo depende da entrada:
não vai produzir nada.
$1=$1
avalia o que estiver no primeiro campo, que é0
neste caso; esse é um resultado “falso” no AWK, então nada acontece e nada é gerado. Para evitar isso, transforme$1=$1
em uma ação e faça com que o AWK imprima o registro atual em todos os casos:1
faz com que o AWK sempre execute a ação padrão.