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?

a==byb==aprodujera el mismo resultado?Two-file Processingen backreference.org/2010/02/10/idiomatic-awkRespuestas:
En awk, se
FNRrefiere al número de registro (normalmente el número de línea) en el archivo actual y seNRrefiere al número total de registro. El operador==es un operador de comparación, que devuelve verdadero cuando los dos operandos circundantes son iguales.Esto significa que la condición
NR==FNRsolo es verdadera para el primer archivo, ya que seFNRrestablece a 1 para la primera línea de cada archivo, peroNRsigue aumentando.Este patrón se usa generalmente para realizar acciones solo en el primer archivo. El
nextinterior del bloque significa que se omiten los comandos adicionales, por lo que solo se ejecutan en archivos distintos del primero.La condición
FNR==NRcompara los mismos dos operandos queNR==FNR, por lo que se comporta de la misma manera.fuente
a='3x'; if [[ $a == 3* ]]; then echo yes; fiy no puedes cambiar ambos lados de==.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];}' file1Paso 2: Complete la matriz ay 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 file2Paso 3: ignore las acciones que puedan surgir después del
}análisis del archivo 1awk 'NR==FNR{a[$1];next}' file1 file2Paso 4: imprima la clave del archivo2 cuando se encuentre en la matriz a
awk 'NR==FNR{a[$1];next} $1 in a{print $1}' file1 file2fuente
;nextes una adición extraña (como agregarnexty necesito el punto y coma en el paso 3). Puede probar el paso 1 conawk '{a[$1]} END { for (k in a) { print "a[k]=" k } }' file1.Busque
NRyFNRen el manual de awk y luego pregúntese cuál es la condición bajo la cualNR==FNRen 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 efuente
ARGIND, de lo contrario puedes hacerloFNR==1{ print ++file_nr }.Existen
awkvariables integradas.NR- Da el número total de registros procesados.FNR- Da el número total de registros para cada archivo de entrada.fuente
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 7Tenga en cuenta que NR y FNR son variables integradas de awk. NR: proporciona el número total de registros procesados. (en este caso tanto en a.txt como en 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 1vamos a agregar "siguiente" para omitir el primero que coincide 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 1en 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 7fuente