2012-05-14 9 views
5

tengo dos archivos, AA y BB:join omitiendo líneas de salida cuando la entrada ordenados numéricamente

$ cat aa 
84 xxx 
85 xxx 
10101 sdf 
10301 23 

$ cat bb 
82 asd 
83 asf 
84 asdfasdf 
10101 22232 
10301 llll 

yo uso el comando unirse a unirse a ellos:

$ join aa bb 
84 xxx asdfasdf 

pero lo esperado es 84, 10101 y 10301 todos unidos. ¿Por qué solo se ha unido 84?

+0

@qiuxafei editó el etiquetado de la pregunta: join no es parte de bash, pero es una herramienta UNIX estándar accesible desde cualquier shell. –

Respuesta

8

Utilice una ordenación lexicográfica en lugar de una clasificación numérica.

Para hacer esto como parte del proceso:

$ join <(sort aa) <(sort bb) 

Esto le da a la salida:

10101 sdf 22232 
10301 23 llll 
84 xxx asdfasdf 
+2

¿Se une la orden numérica de soporte? – qiuxiafei

+1

@qiuxiafei no, join no admite el orden numérico. –

6

Usted no incluyó el hecho de que un mensaje de error se emite:

$ join aa bb 
join: file 2 is not in sorted order 
84 xxx asdfasdf 
join: file 1 is not in sorted order 

Puede usar una ordenación lexicográfica normal:

join <(sort aa) <(sort bb) | sort -k1,1n 
+2

no todas las implementaciones dan este error, algunas simplemente fallan silenciosamente. –

3

Si se quiere evitar la clasificación, entonces se puede poner a cero almohadilla con awk:

join \ 
<(awk '{printf("%05d %s\n", $1, $2)}' aa) \ 
<(awk '{printf("%05d %s\n", $1, $2)}' bb) \ 
| awk '{print int($1),$2,$3}' 

genera esta salida que preserva el orden de clasificación originales:

84 xxx asdfasdf 
10101 sdf 22232 
10301 23 llll 

¿Quieres evitar especie, porque el tipo de Unix es O (n log n).

Cuestiones relacionadas