¿Qué es “NR == FNR” en awk?

Estoy aprendiendo la comparación de archivos usando awk .

Encontré syntax como a continuación,

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

No pude entender cuál es la importancia de NR==FNR en esto? Si bash con FNR==NR entonces también obtengo la misma salida?

¿Qué es exactamente?

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

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

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

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

Paso 3: Ignora las acciones que pueden venir después } al analizar el archivo 1

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

Paso 4: imprime la clave del archivo2 cuando se encuentra en la matriz a

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

En awk, FNR refiere al número de registro (generalmente el número de línea) en el archivo actual y NR refiere al número total de registro. Esto significa que la condición NR==FNR solo es verdadera para el primer archivo, ya que FNR restablece a 1 para la primera línea de cada archivo, pero NR sigue aumentando.

Este patrón generalmente se usa para realizar acciones solo en el primer archivo. El next dentro del bloque significa que se omiten los comandos adicionales, por lo que solo se ejecutan en archivos que no sean el primero.

No está claro por qué esperaría que FNR==NR fuera diferente a NR==FNR .

Busque NR y FNR en el manual de awk y luego pregúntese cuál es la condición bajo la cual NR==FNR en el siguiente ejemplo:

 $ cat file1 a b c $ cat file2 d e $ awk '{print FILENAME, NR, FNR, $0}' file1 file2 file1 1 1 a file1 2 2 b file1 3 3 c file2 4 1 d file2 5 2 e 

Hay awk variables incorporadas.

NR : da la cantidad total de registros procesados.

FNR : da la cantidad total de registros para cada archivo de entrada.

Suponiendo que tiene archivos a.txt y b.txt con

 cat a.txt a b c d 1 3 5 cat b.txt a 1 2 6 7 

Tenga en cuenta que NR y FNR son awk variables incorporadas. NR: da la cantidad total de registros procesados. (en este caso ambos en a.txt y b.txt) FNR – Da el número total de registros para cada archivo de entrada (registros en a.txt o b.txt)

 awk 'NR==FNR{a[$0];}{if($0 in a)print FILENAME " " NR " " FNR " " $0}' a.txt b.txt a.txt 1 1 a a.txt 2 2 b a.txt 3 3 c a.txt 4 4 d a.txt 5 5 1 a.txt 6 6 3 a.txt 7 7 5 b.txt 8 1 a b.txt 9 2 1 

permite Añadir “siguiente” para omitir el primero emparejado con NR == FNR

en b.txt y en a.txt

 awk 'NR==FNR{a[$0];next}{if($0 in a)print FILENAME " " NR " " FNR " " $0}' a.txt b.txt b.txt 8 1 a b.txt 9 2 1 

en b.txt pero no en a.txt

  awk 'NR==FNR{a[$0];next}{if(!($0 in a))print FILENAME " " NR " " FNR " " $0}' a.txt b.txt b.txt 10 3 2 b.txt 11 4 6 b.txt 12 5 7 awk 'NR==FNR{a[$0];next}!($0 in a)' a.txt b.txt 2 6 7