¿Qué son NR y FNR y qué implica "NR==FNR"?

Resuelto Amit asked hace 9 años • 0 respuestas

Estoy aprendiendo a comparar archivos usando awk.

Encontré una sintaxis como la siguiente,

awk 'NR==FNR{a[$1];next}$1 in a{print $1}' file1 file2

No pude entender cuál es el significado de NR==FNResto. Si lo intento, FNR==NR¿también obtengo el mismo resultado?

¿Qué hace exactamente?

Amit avatar Sep 09 '15 21:09 Amit
Aceptado

En Awk:

  • FNRse refiere al número de registro (normalmente el número de línea) en el archivo actual.
  • NRse refiere al número total de registros.
  • El operador ==es un operador de comparación, que devuelve verdadero cuando los dos operandos circundantes son iguales.

Esto significa que la condición normalmenteNR==FNR solo es verdadera para el primer archivo, ya que se restablece a 1 para la primera línea de cada archivo pero sigue aumentando. Este patrón se utiliza normalmente para realizar acciones sólo en el primer archivo. Funciona asumiendo que el primer archivo no está vacío; de lo contrario, las dos variables continuarían siendo iguales mientras Awk procesaba el segundo archivo.FNRNR

El nextinterior del bloque significa que se omiten más comandos, por lo que solo se ejecutan en archivos distintos del primero.

La condición FNR==NRcompara los mismos dos operandos que NR==FNR, por lo que se comporta de la misma manera.

Tom Fenech avatar Sep 09 '2015 14:09 Tom Fenech

Busque claves (primera palabra de la línea) en el archivo2 que también están en el archivo1.
Paso 1: complete la matriz a con las primeras palabras del archivo 1:

awk '{a[$1];}' file1

Paso 2: complete la matriz a e ignore el archivo 2 en el mismo comando. Para esto verifique el número total de registros hasta ahora con el número del archivo de entrada actual.

awk 'NR==FNR{a[$1]}' file1 file2

Paso 3: Ignore las acciones que puedan surgir después }al analizar el archivo 1

awk 'NR==FNR{a[$1];next}' file1 file2 

Paso 4: imprima la clave del archivo 2 cuando se encuentre en la matriz a

awk 'NR==FNR{a[$1];next} $1 in a{print $1}' file1 file2
Walter A avatar Sep 09 '2015 19:09 Walter A