¿Cómo puedo fusionar 2 archivos línea por línea con el mismo registro en awk/shell?

¿Cómo puedo fusionar 2 archivos línea por línea con el mismo registro en awk/shell?

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==FNRes 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 asi 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

joines una herramienta estándar especificada en POSIX.

La joinpá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.

información relacionada