awk
Procesamiento de dos archivos
Buscar..
Compruebe los campos coincidentes en dos archivos
Teniendo en cuenta estos dos archivos CSV:
$ cat file1
1,line1
2,line2
3,line3
4,line4
$ cat file2
1,line3
2,line4
3,line5
4,line6
Para imprimir esas líneas en el archivo file2 cuya segunda columna aparece también en el primer archivo podemos decir:
$ awk -F, 'FNR==NR {lines[$2]; next} $2 in lines' file1 file2
1,line3
2,line4
Aquí, las lines[] contienen una matriz que se llena al leer el file1 con el contenido del segundo campo de cada línea.
Luego, la condición $2 in lines verifica, para cada línea en file2 , si el segundo campo existe en la matriz. Si es así, la condición es Verdadera y awk realiza su acción predeterminada, que consiste en imprimir la línea completa.
Si solo se necesitaba imprimir un campo, esta podría ser la expresión:
$ awk -F, 'FNR==NR {lines[$2]; next} $2 in lines {print $1}' file1 file2
1
2
Imprimir variables awk al leer dos archivos
Espero que este ejemplo ayude a todos a comprender cómo cambian las variables internas de awk como NR, FNR, etc. cuando awk está procesando dos archivos.
awk '{print "NR:",NR,"FNR:",FNR,"fname:",FILENAME,"Field1:",$1}' file1 file2
NR: 1 FNR: 1 fname: file1 Field1: f1d1
NR: 2 FNR: 2 fname: file1 Field1: f1d5
NR: 3 FNR: 3 fname: file1 Field1: f1d9
NR: 4 FNR: 1 fname: file2 Field1: f2d1
NR: 5 FNR: 2 fname: file2 Field1: f2d5
NR: 6 FNR: 3 fname: file2 Field1: f2d9
Donde se ven file1 y file2:
$ cat file1
f1d1 f1d2 f1d3 f1d4
$ cat file2
f2d1 f2d2 f2d3 f2d4
Observe cómo el valor de NR sigue aumentando entre todos los archivos, mientras que FNR restablece en cada archivo. Esta es la razón por la que la expresión NR==FNR siempre se refiere al primer archivo enviado a awk, ya que solo en el primer archivo es posible tener NR igual a FNR .