entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

¿Cómo Hacer JOIN de dos ficheros mediante Shell Script/AWK??

Hola a todos:

tengo la necesidad de hacer un cruce entre 2 ficheros mediante un determinado campo y una determinada lógica de manera que si la información cruza pueda rescatar el valor del fichero 2 y ponerlo en el fichero 1. El caso esque esto sabría hacerlo perfectamente mediante una query de SQL en ORACLE pero hacerlo mediante un .sh se me escapa, creo que lo mejor para tratar ficheros es utilizar AWK, pero no lo tengo del todo claro. Os pongo un ejemplo mas o menos gráfico de lo que necesito, tengo 2 ficheros, los cuales no tienen separador de campo pero sí una delimitación fija que conozco :

fichero1.dat

25742telefono1mac1577S
64523telefono2mac2655N

fichero2.dat

mac1valor15
mac2valor28

necesitaría cruzar el valor 'mac1' del fichero 1 contra el valor 'mac1' del fichero 2 y si cruza sustituir el valor del fichero 1 por otro campo del fichero 2, quedando finalmente algo así:

fichero1

25742telefono1valor1577S
64523telefono2mac2655N

el segundo registro no cambia ya que no cumple la lógica en la que se dice que el último campo del registro debe ser='S'.

Agredecería me echárais un cable.
Un saludo
-bertxo-

0voto

Leonardo-Tadei comentado

Podrías por favor editar la pregunta y marcar como código el contenido de muestra de los archivos?
Así podemos ver en ancho y la separación de las columnas...

1 Respuesta

2votos

white Puntos75880

No se exactamente que deseas lograr, entendi que solo quieres reemplazar 'mac1' por 'valor1' siempre y cuando la linea del archivo 1 termine en 'S', es asi o estoy realmente mal interpretandote?

este es el archivo awk que hize con lo que te entendi:

'finder'

BEGIN { 
    FS="" 
}
{
    ## first file
    if(NR == FNR){

        ## si la linea termina con una 'S' lo agregamos a la lista
        if(match($0, /S$/))
            file1[$0] = $0
        ## esta linea va a la lista negra (:
        else
            file1_missed[$0] = $0
    }
    else{

        ## recorremos los elementos del archivo 1
        for (i in file1){

            ## obtenemos el valor de 'mac'
            ## tomamos la linea del archivo 2 y buscamos mac[numero]valor[numero]
            match($0, /(mac[0-9])(valor[0-9])/, macValue)

            ## si el elemento del archivo 1 contiene 'mac(numero)' reemplazamos por valor(numero)
            if(match(file1[i], macValue[1])){
                gsub (macValue[1], macValue[2], file1[i] )

                ## imprimimos la linea reemplazada
                print file1[i]
            }
        }
    }
}
END{

    ## imprimimos las lineas en lista negra!
    for (i in file1_missed)
        print file1_missed[i]
}

como no se tu delimitador, supondre que solo usas una columna FS=""

con el comando en la terminal:

awk -f finder file1.dat file2.dat

o si deseas enviar la salida a un archivo:

awk -f finder file1.dat file2.dat >> 'output.txt'

me devuelve:

root@ubuntu:/home/white/workspace/bash# awk -f finder file1.dat file2.dat
25742telefono1valor1577S
64523telefono2mac2655N

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta