join

Une líneas de dos archivos de texto por un campo común, por defecto la primera palabra (campo) separada por un espacio (delimitador). Los espacios iniciales se ignoran. Ejemplo:

 join -n  file1.txt file2.txt

Uno de eso archivos puede ser - (standar input). Las opciones son:

-a 1    imprime también lineas no emparejadas de file1.txt
-v 1            lo mismo, pero quita las emparejadas
-e EMPTY        cambia entradas missing por EMPTY
-i              mayúsculas-minúsculas
-n              se ordenan numéricamente
-o FORMAT       0, comas, espacios (formato de salida)
-t :          usa : como separador (entrada y salida)
-1 CAMPO        une usando este campo del archivo 1
-2 CAMPO        une usando este campo del archivo 2

Por ejemplo, imaginemos estos dos archivos. Uno con nombres y apellidos (por sencillez omitimos acentos y mayúsculas) y otro con una lista de deudas, solo con nombres.

 file1.txt             file2.txt
 ---------------       ---------------------
 pepe comino           pepe    debe    10000
 jose perez             carmen  debe    400
 carmen matas          lola    debe    0
                       fran    debe    200

Si queremos un listado de las deudas, pero con el nombre completo, podríamos hacer:

$ join  file1.txt file2.txt
 pepe comino debe 10000

Pero esto sólo une la primera línea, ya que solo ella tiene campo coincidente

$ join  file1.txt file2.txt
 pepe comino debe 10000
 jose perez debe 10000
 carmen matas debe 400

Ahora saca todos los casos coincidentes, pero no salen "lola" y "fran" ya que no tenemos sus apellidos, pero podemos sacarlos de todos modos con "-a2" o verlos sólo a ellos con "-v2" :

$ join -n -a 2 file1.txt file2.txt
 pepe comino debe 10000
 jose perez debe 10000
 carmen matas debe 400
 lola debe 0
 fran debe 200