¿Qué son NR y FNR y qué implica "NR==FNR"?
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==FNR
esto. Si lo intento, FNR==NR
¿también obtengo el mismo resultado?
¿Qué hace exactamente?
En Awk:
FNR
se refiere al número de registro (normalmente el número de línea) en el archivo actual.NR
se 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.FNR
NR
El next
interior del bloque significa que se omiten más comandos, por lo que solo se ejecutan en archivos distintos del primero.
La condición FNR==NR
compara los mismos dos operandos que NR==FNR
, por lo que se comporta de la misma manera.
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