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?
a==b
yb==a
produjera el mismo resultado?Two-file Processing
en backreference.org/2010/02/10/idiomatic-awkRespuestas:
En awk, se
FNR
refiere al número de registro (normalmente el número de línea) en el archivo actual y seNR
refiere 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==FNR
solo es verdadera para el primer archivo, ya que seFNR
restablece a 1 para la primera línea de cada archivo, peroNR
sigue aumentando.Este patrón se usa generalmente para realizar acciones solo en el primer archivo. El
next
interior del bloque significa que se omiten los comandos adicionales, por lo que solo se ejecutan en archivos distintos del primero.La condición
FNR==NR
compara los mismos dos operandos queNR==FNR
, por lo que se comporta de la misma manera.fuente
a='3x'; if [[ $a == 3* ]]; then echo yes; fi
y 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];}' file1
Paso 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 file2
Paso 3: ignore las acciones que puedan surgir después del
}
análisis del archivo 1awk 'NR==FNR{a[$1];next}' file1 file2
Paso 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 file2
fuente
;next
es una adición extraña (como agregarnext
y 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
NR
yFNR
en el manual de awk y luego pregúntese cuál es la condición bajo la cualNR==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
fuente
ARGIND
, de lo contrario puedes hacerloFNR==1{ print ++file_nr }
.Existen
awk
variables 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 7
Tenga 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 1
vamos 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 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
fuente