Soy nuevo en awk y shell y me pregunto cómo puedo fusionar 2 archivos con la línea que tienen el mismo registro usando shell/awk. file1 y file2 pueden tener un orden diferente para el nombre. Sólo quiero fusionar las líneas que tienen el mismo registro. por favor ayuda.
file1.txt
Mary 68
Tom 50
Jason 45
Lu 66
file2.txt
Jason 37
Tom 26
Mary 74
Tina 80
mergefile.txt
Marry 68 74
Tom 50 26
Jason 45 37
Intenté awk, pero lleva algunos minutos ejecutar el script. Me pregunto si podría haber una implementación más rápida y sencilla.
cat file1.txt | while read line
do
score1=$( echo $line | awk '{print $2}');
name1=$( echo $line | awk '{print $1}');
cat file2.txt | while read l
do
score2=$( echo $l | awk '{print $2}');
name2=$( echo $l | awk '{print $1}');
if [[ $name1 == $name2 ]]
then
echo "$name1 $score1 $score2" >> mergefile
break
fi
done
done
Respuesta1
Si quieres usar awk:
$ awk 'NR==FNR {a[$1] = $2; next} $1 in a {print $1, $2, a[$1]}' file2.txt file1.txt
Mary 68 74
Tom 50 26
Jason 45 37
No es necesario ordenar y la salida estará en el orden del segundo archivo proporcionado.
Explicación:
NR==FNR
es la forma canónica de seleccionar registros del primer archivo nombrado{a[$1] = $2; next}
llenar una matriz con claves del primer campo y valores del segundo$1 in a
si el primer campo ya fue visto en el primer archivo; entonces{print $1, $2, a[$1]}
Imprima la clave y el valor del segundo archivo y el valor del primero.
Respuesta2
Esto suena como un trabajo parajoin
, el operador de base de datos relacional
join <(sort file1.txt) <(sort file2.txt)
Pruebas
$ cat file1.txt
Mary 68
Tom 50
Jason 45
Lu 66
$ cat file2.txt
Jason 37
Tom 26
Mary 74
Tina 80
$ join <(sort file1.txt) <(sort file2.txt)
Jason 45 37
Mary 68 74
Tom 50 26
join
es una herramienta estándar especificada en POSIX.
La join
página de manual dice:
The files file1 and file2 shall be ordered in the collating sequence of sort -b on the fields on which they shall be joined, by default the first in each line. All selected output shall be written in the same collating sequence.