Foros del Web » Administración de Sistemas » Unix / Linux »

Buscar en otro fichero con uno abierto

Estas en el tema de Buscar en otro fichero con uno abierto en el foro de Unix / Linux en Foros del Web. Hola chic@s, Soy habitual programador en Shellscript/AWK y quiero pasar un código a todo con AWK porque la ejecucion es mucho más rápida. En un ...
  #1 (permalink)  
Antiguo 14/11/2012, 08:17
 
Fecha de Ingreso: noviembre-2012
Ubicación: Alcorcón, España
Mensajes: 3
Antigüedad: 12 años, 1 mes
Puntos: 0
Busqueda Buscar en otro fichero con uno abierto

Hola chic@s,

Soy habitual programador en Shellscript/AWK y quiero pasar un código a todo con AWK porque la ejecucion es mucho más rápida. En un script, proceso un fichero con datos a dos columnas y necesito consultar el segundo campo en otro fichero y extraer el segundo campo de ese fichero y usarlo en mi fichero principal, es decir:
Fichero f1 (VPN VLAN), y Fichero f2 (VLAN Trafico_actual) y quiero mientras proceso f1 por cada VLAN que obtengo buscarla en f2. Actualmente lo que hago es cogerla llamando a un grep al otro fichero y con getline la meto en el awk principal. ¿Puedo buscar un dato en otro fichero sin salir de AWK y obtener el campo X?

Gracias,
Marc.
  #2 (permalink)  
Antiguo 15/11/2012, 06:16
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Buscar en otro fichero con uno abierto

Antes de entrar en AWK, ¿no te serviría grep + join?

A propósito de grep, suele ser bastante más rápido que AWK, por lo que me sorprende un poco tu primer comentario, ¿será que no estás haciendo las cosas de la forma más eficiente? ¿cómo es tu programa ahora mismo?
  #3 (permalink)  
Antiguo 19/11/2012, 03:41
 
Fecha de Ingreso: noviembre-2012
Ubicación: Alcorcón, España
Mensajes: 3
Antigüedad: 12 años, 1 mes
Puntos: 0
Respuesta: Buscar en otro fichero con uno abierto

Me he dado cuenta que con join me resuelve ese problema porque lo uno todo en un fichero que es muy rápido y luego con awk hago la suma para registros con el mismo campo.
Antes, dentro de awk, buscaba con grep cada valor del fichero 2 y al retornarlo, lo sumaba, y con tantas búsquedas (tantas como lineas tenia el fichero 1) se ralentizaba mucho. Con join ordenando el campo clave siempre, es coser y cantar y mucho mas rapido.

Gracias,
  #4 (permalink)  
Antiguo 20/11/2012, 08:59
 
Fecha de Ingreso: noviembre-2012
Ubicación: Alcorcón, España
Mensajes: 3
Antigüedad: 12 años, 1 mes
Puntos: 0
Respuesta: Buscar en otro fichero con uno abierto

Tengo un problema con join. Si es cierto que es mas rapido que awk pero no me une todo lo que quiero:
Tengo un fichero con este contenido
fichero1
668 870
677 890
702 915
717 927
721 1358
725 948
1328 400

fichero2
54 3364472 6939864
70 816 816
117 188712 1854080
161 41144 3712
668 6863416 5826016
736 20417408 10537776
848 15872 19288
876 1188696 15550096
897 14530720 5917744
938 213296 273536
1328 34024 1062688
2013 5691816 2765800


Al hacer join fichero1 fichero2
no devuelve nada, y eso que los campos de combinación están ordenados son sort -k1n previamente.

Si elimino del fichero2 las dos primeras lineas, entonces devuelve como resultado
668 870 6863416 5826016
que es lo que cabia esperar

La solución es
668 870 6863416 5826016
1328 400 34024 1062688

Pero ésta última linea nunca la pone. Cómo puedo hacer la union correctamente?
  #5 (permalink)  
Antiguo 20/11/2012, 10:52
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Buscar en otro fichero con uno abierto

Estuve haciendo algunas pruebas, y llegué a la conclusión de que el problema es que join está considerando orden de cadenas, no orden numérico. Es decir, como cadena "70" > "117", y por lo tanto join considera que su entrada está desordenada.

Una opción posible es hacer que sort ordene como cadena y no como número (elimina el -n), de este modo join tendrá las líneas ordenadas como lo requiere. Si necesitás orden numérico, lo podrías hacer luego de terminar de procesar el archivo.


Saludos.

Etiquetas: awk, buscar+datos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:01.