GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo funciona Awk '!a[$0]++'?

Este one-liner elimina las líneas duplicadas de la entrada de texto sin ordenarlas previamente.

Por ejemplo:

$ cat >f
q
w
e
w
r
$ awk '!a[$0]++' <f
q
w
e
r
$ 

El código original que encontré en Internet decía:

awk '!_[$0]++'

Esto fue aún más desconcertante para mí cuando tomé _ tener un significado especial en awk, como en Perl, pero resultó ser solo el nombre de una matriz.

Ahora, entiendo la lógica detrás del one-liner:
cada línea de entrada se usa como una clave en una matriz hash, por lo tanto, al completarse, el hash contiene líneas únicas en el orden de llegada.

Lo que me gustaría aprender es cómo awk interpreta exactamente esta notación. P.ej. qué signo de explosión (! ) significa y los demás elementos de este fragmento de código.

¿Cómo funciona?

Respuesta aceptada:

Aquí hay una respuesta "intuitiva", para obtener una explicación más detallada del mecanismo de awk, consulte @Cuonglm's

En este caso, !a[$0]++ , el incremento posterior ++ se puede dejar de lado por un momento, no cambia el valor de la expresión. Entonces, mira solo !a[$0] . Aquí:

a[$0]

usa la línea actual $0 como clave para la matriz a , tomando el valor allí almacenado. Si nunca antes se hizo referencia a esta clave en particular, a[$0] evalúa a la cadena vacía.

!a[$0]

El ! niega el valor de antes. Si estaba vacío o cero (falso), ahora tenemos un resultado verdadero. Si no es cero (verdadero), tenemos un resultado falso. Si la expresión completa se evaluó como verdadera, lo que significa que a[$0] no se configuró para empezar, toda la línea se imprime como la acción predeterminada.

Además, independientemente del valor anterior, el operador de incremento posterior agrega uno a a[$0] , por lo que la próxima vez que se acceda al mismo valor en la matriz, será positivo y toda la condición fallará.


Linux
  1. ¿Qué es un Makefile y cómo funciona?

  2. ¿Qué es NGINX? ¿Como funciona?

  3. ¿Qué es un servidor web y cómo funciona un servidor web?

  4. ¿Cómo funciona la punta adhesiva?

  5. ¿Cómo funciona el comando ps?

¿Cómo funciona Git?

¿Cómo funciona SFTP?

Ssh:¿cómo funciona el túnel Ssh inverso?

Linux:¿cómo funciona la pantalla de Linux?

¿Cómo funciona el intercambio de memoria en Linux?

¿Cómo funciona la pantalla de Linux?