2009-06-12 8 views
13

Tengo dos archivos donde quiero realizar la operación de unión basado en 1ª columna:relleno de campos vacía en Unix operación de unión

file1.txt

foo 1 
bar 2 
qux 3 

file2.txt

foo x 
qux y 
boo z 

El resultado que espero obtener es el siguiente:

foo 1 x 
bar 2 - 
qux 3 y 
boo - z 

donde los campos vacíos de la columna 1 están rellenos con "-".

¿Pero por qué este comando de unión no funciona como esperaba?

$ join -a1 -a2 -e"-" file1.txt file2.txt 

¿Cuál es la forma correcta de hacerlo?

Respuesta

21

"Importante: FILE1 y FILE2 deben ordenarse en los campos de combinación." (desde la página de manual en línea de this).

Este problema # 1. Problema # 2 es peor: -e opción está mal documentado - sólo funciona en conjunción con -o, así por ejemplo:

$ join -a 1 -a 2 -e'-' -o '0,1.2,2.2' sfile1.txt sfile2.txt 
bar 2 - 
boo - z 
foo 1 x 
qux 3 y 

donde el nombre s prefijo de archivos que he sort ed previamente indicado.

Editar: man join explica el interruptor -o (también lo hace la página de manual en línea que menciono arriba). Especifica los campos para la salida (1.2 significa el segundo campo del archivo 1, & c), o 0 para indicar el campo de combinación, y es una lista separada por comas. (En realidad, no recordaba el valor 0, así que originalmente había dado una solución más torpe que requería un postprocesamiento de awk, pero la solución actual es mejor ... ¡y no se necesita awk!).

+0

@Alex: muchas gracias. No entiendo la opción "-o '1.1,2.1,1.2,2.2'". ¿Dónde puedo encontrar información sobre eso? Además, si no te importa el awk por favor? – neversaint

+1

He editado la respuesta para explicar el -o, pero miro 'man awk': como lo hice, para verificar mi explicación, me acordé del valor 0 para el número de campo, que ahora he usado en el ejemplo editado y hace que el procesamiento posterior no sea necesario. ¡Pero recuerde ordenar sus archivos de antemano! -) –

+0

@Alex, gracias un millón. – neversaint

2

-e -o sólo funciona con

join -a 1 -a 2 -e"-" -o auto file1.txt file2.txt