¿Cómo funciona este script AWK?

0

Tengo 2 archivos de datos, cada uno contiene una columna. Quiero hacer otro archivo de datos mediante la fusión de las dos columnas. Tengo la línea de comandos en 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

Utilicé el comando anterior para escribir un script de shell y obtuve el siguiente resultado:

11 13
23 19
19 25
31 67
67 93

Quiero saber cómo funciona esta línea de comando en este ejemplo para dar salida.

    
pregunta Pragyant Prada Behera 02.03.2017 - 13:33

1 respuesta

1

Bueno, parte de aprender a usar Unix es averiguar qué están haciendo los scripts existentes. En este caso, necesita saber un poco acerca de cómo awk funciona para entender el código. Me centraré en describir la parte awk , esto te ayudará a comenzar a calcular el resto.

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

En tu ejemplo tienes tres patrones / líneas de código:

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

NR y FNR son dos variables especiales establecidas por awk . Puedes ver su significado con man awk para ver que

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

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

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

Este bloque de código no tiene ninguna condición / patrón, por lo que se ejecuta para cada línea leída (de todos los archivos, incluido el primero).

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

Esta parte se ejecuta después de que se haya leído y procesado la última línea del último archivo.

Con estos conceptos básicos, deberías poder descubrir el significado de los diferentes bloques de código y las variables.

    
respondido por el nohillside 02.03.2017 - 20:14

Lea otras preguntas en las etiquetas