2011-06-18 20 views
6

Esto no funciona como espero, a pesar de todas las investigaciones. Debo estar perdiendo algo ...Utilice el comando UNIX JOIN para unir dos archivos

Archivo 1 ...

# cat file1.csv 
1  123  JohnDoe 
1  456  BobDylan 
1  789  BillyJean 

Archivo 2 ...

# cat file2.csv 
111  123  DaddyDoe 
222  456  DaddyDylan 
666  777  Stranger 
555  789  DaddyJean 
444  888  Stranger 
333  999  Stranger 

Estoy tratando de unirse a ambos los segundos campos. Cuando realizo una combinación externa izquierda y solo incluyo los campos del primer archivo, todo parece dandy.

# join -1 2 -2 2 -a 1 -o 1.2 1.3 file1.csv file2.csv 
123 JohnDoe 
456 BobDylan 
789 BillyJean 

Pero tan pronto como incluyo un campo del segundo archivo, todo se vuelve loco.

# join -1 2 -2 2 -a 1 -o 1.2 1.3 2.3 file1.csv file2.csv 
DaddyDoeoe 
DaddyDylann 
789 BillyJean DaddyJean 

¡La última línea parece perfecta! ¿Qué pasa con los demás? ¿Alguna idea? ¡Gracias por adelantado!

EDITAR: Aquí está mi intento con los CSV reales.

# cat file1.csv 
1,123,JohnDoe 
1,456,BobDylan 
1,789,BillyJean 

# cat file2.csv 
111,123,DaddyDoe 
222,456,DaddyDylan 
666,777,Stranger 
555,789,DaddyJean 
444,888,Stranger 
333,999,Stranger 

# join -t, -1 2 -2 2 -a 1 -o 1.2 1.3 2.3 file1.csv file2.csv 
,DaddyDoeoe 
,DaddyDylann 
789,BillyJean,DaddyJean 
+0

qué versión del sistema operativo está utilizando? ¿Y las columnas están realmente delimitadas con ',' s, según la extensión del archivo? – shellter

+0

-o opción debe ser comillas, o puede usar delimitado por comas en lugar de espacio en blanco. No estoy seguro de si ese es el problema, pero parece ser un problema parcial, – Suroot

+0

@shellter Unix 3.5. Son archivos delimitados por tabuladores. Saqué las comas cuando intentaba solucionar el problema. @Suroot Di un tiro, pero no pareció cambiar nada. – Nate

Respuesta

5

utilizó la opción -a.

-a file_number

Además de la salida por defecto, producir una línea para cada línea unpairable en file_number archivo.

Además, el comportamiento de sobrescritura impar indica que tiene retornos de carro incrustados (\r). Examinaría esos fies de cerca con cat -v o un editor de texto que no intenta ser "inteligente" sobre los archivos de Windows.

+0

Hola @geekosaur, sí, esto es lo que pretendo. – Nate

+0

@Nate: Entonces, ¿por qué estás confundido? Obtienes lo que pediste; como con una combinación externa de SQL, los campos del otro archivo son NULL (vacío). – geekosaur

+0

hay tres coincidencias entre los archivos: 123, 456, 789. No debería haber datos faltantes.No solo eso, sino que las primeras dos líneas de salida tienen los nombres de los dos archivos mezclados. – Nate

2

Utilice el separador de 'campo' correcto en su comando.

Cuando me cambiaron sus datos a cierto csv, y se utiliza

join -t, -1 2 -2 2 -a 1 -o 1.2 1.3 2.3 file1.csv file2.csv 
# ---^^^ 

que tiene

123,JohnDoe,DaddyDoe 
456,BobDylan,DaddyDylan 
789,BillyJean,DaddyJean 

espero que esto ayude.

+0

Gracias @shellter. Lo hice pero obtuve resultados muy similares. He agregado el código a mi pregunta. – Nate

-1

Si está haciendo esta línea de comando, ¿por qué no usar pegar? pasta -d, archivo1 archivo2 >> archivo3

la arugment -d es el delimitador

+0

Probablemente porque 'paste' hace algo completamente diferente ... – geirha

Cuestiones relacionadas