0 votos

¿Cómo funciona este script AWK?

Tengo 2 archivos de datos, cada uno con una columna. Quiero hacer otro archivo de datos mediante la fusión de las columnas. Tengo la línea de comandos en la shell, pero no sé cómo funciona.

Por favor explique detalladamente el siguiente comando:

awk 'NR==FNR {a[i++]=$0};
             {b[x++]=$0;};{k=x-i};
     END     {for(j=0;j<i;) print a[j++],b[k++]}' \
  file1.txt file2.txt

Ejemplo:

entrada:

file1.txt   
11
23
19
31
67
file2.txt
13
19
25
67
93

He utilizado el comando de arriba para escribir una secuencia de comandos de shell y consiguió siguiente resultado:

11 13
23 19
19 25
31 67
67 93

Quiero saber cómo esta línea de comandos está trabajando en este ejemplo para dar la salida?

1voto

Bueno, a parte de aprender a utilizar Unix es averiguar lo que los scripts existentes están haciendo. En este caso, usted necesita saber un poco acerca de cómo awk obras de entender el código. Me voy a centrar en la descripción de la awk parte, esto debe empezar en averiguar el resto.

Básicamente awk es un patrón, impulsado lenguaje de secuencias de comandos, donde los comandos consisten de una búsqueda (search)/patrón de la condición y de la correspondiente bloque de código. Durante la ejecución, los archivos de entrada se lee línea por línea, y si el patrón/la condición es verdadera para una línea, el bloque de código se ejecuta. Hay modelos especiales BEGIN y END que se utilizan para activar el código que se ejecuta antes de la primera línea, o después de la última línea que se lee.

En su ejemplo, usted tiene tres/patrón de líneas de código:

NR==FNR {a[i++]=$0};

NR y FNR son dos variables especiales establecidos por awk. Usted puede buscar su significado con man awk a ver que

NR     ordinal number of the current record
FNR    ordinal number of the current record in the current file

así que, básicamente, esta condición es true, mientras que las líneas de la primera línea se lee (lo que significa que a[i++]=$0 se ejecuta una vez por cada línea del primer archivo) y false para todos los archivos adicionales. $0 es la actual línea de entrada.

        {b[x++]=$0;};{k=x-i};

Este bloque de código no tiene la condición de patrón de modo que se ejecuta para cada línea de lectura (de todos los archivos, incluyendo la primera).

END     {for(j=0;j<i;) print a[j++],b[k++]}' 

Esta parte se ejecuta después de la última línea de la última archivo ha sido leído y procesado.

Con estos básicos que usted debe ser capaz de averiguar el significado de los diferentes bloques de código y variables de sí mismo.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X