Esta es la contestación más acertada que encomtrarás compartir, pero mírala pausadamente y analiza si es compatible a tu proyecto.
Solución:
Cuando asignamos un valor a una variable de campo, es decir. el valor de $1 se asigna al campo $1, awk en realidad reconstruye su $0 concatenándolos con el espacio delimitador de campo predeterminado (u OFS).
también podemos obtener el mismo caso en los siguientes escenarios…
echo -e "foo footbarttbar" | awk '$1=$1'
foo foo bar bar
echo -e "foo footbarttbar" | awk -v OFS=',' '$1=$1'
foo,foo,bar,bar
echo -e "foo footbarttbar" | awk '$3=1'
foo foo 1 bar
Para GNU AWK, este comportamiento se documenta aquí:
https://www.gnu.org/software/gawk/manual/html_node/Changing-Fields.html
$1 = $1 # obligar a reconstituir el registro
echo "$string" | awk '$1=$1'
hace que AWK evalúe $1=$1
que se asigna el campo a sí mismo y tiene el efecto secundario de reevaluar $0
; luego AWK considera el valor de la expresión, y debido a que no es cero ni está vacío, ejecuta la acción predeterminada, que es imprimir $0
.
Los espacios adicionales se eliminan cuando AWK vuelve a evaluar $0
: lo hace concatenando todos los campos usando OFS
como separador, y eso es un solo espacio por defecto. Cuando AWK analiza un registro, $0
contiene el registro completo, tal cual, y $1
para $NF
contener los campos, sin los separadores; cuando se asigna cualquier campo, $0
se reconstruye a partir de los valores de campo.
Si AWK genera algo en este ejemplo depende de la entrada:
echo "0 0" | awk '$1=$1'
no generará nada.
Sección de Reseñas y Valoraciones
Puedes añadir valor a nuestro contenido informacional aportando tu veteranía en los comentarios.