Atasco solucionado (sed)
Supongamos que un archivo ( archivo1 ) contiene esto :
Juan Perez:100
Julio Gomez:101
Miguel Molina:102
Angel Linares:100
Ignacio Matas:100
Lucas Pelucas:101
y supongamos que otro archivo (archivo2) contiene esto :
Cliente:100 Proveedor:101 Franquiciado:102Se pretende escribir un programa shell que muestre el primer archivo pero cambiando los números por los correspondientes nombres del segundo archivo.while read l ; do per=${l%:*} num=${l#*:} tipo=$(grep ":$num" archivo2) tipo=${tipo%:*} echo "$per es un $tipo" done <archivo1Esta es una posible solución a nuestro problema pero queremos sustituir este script por otro que solo utilice una linea para calcular tipo y que en esa linea utilice el comando sed.Aquí empezó mi problema que por fin solucioné ayer:En principio supongamos que que todas las demás lineas están bien.while read l ; do per=${l%:*} num=${l#*:} tipo=$(sed .......) echo "$per es un $tipo" done <archivo1Vale. Ahora que tenemos que conseguir en el sed?Tenemos que conseguir que el resultado sea el nombre el cual su numero adjunto coincida con la variable num.Si lo pensamos en intentar seleccionar una columna se puede hacer eterno pero si en cambio lo que pensamos es que queremos sustituir el :num por un vacio la cosa se simplifica muchísimo.sed es un comando muy útil y sobretodo si se trata de sustituir.En principio utilizaremos la opción -n para que no nos imprima todas las lineas por las que pasa.tipo=$(sed -n ......)queremos sustituir :100 por ejemplo por un vacío para que solo coja Clientepodríamos usar la expresión s/:$num// para sustituir la variable por nada. Ejecutamos en nuevo script:while read l ; do per=${l%:*} num=${l#*:} tipo=$(sed -n -e 's/:$num//' < archivo2) echo "$per es un $tipo" done <archivo1y nada... pero nos vamos acercando a la solución.Después de investigar he leído que si queremos poner el valor de una variable dentro del sed hemos de utilizar "" en vez de '' y poner {VARIABLE}Vale. Vamos a intentar ejecutarlo a ver que pasa:while read l ; do per=${l%:*} num=${l#*:} tipo=$(sed -n -e "s/:${num}//" < archivo2) echo "$per es un $tipo" done <archivo1Ohhhh sigue sin salir nada :'( por que??En realidad pensándolo bien ese sed lo que hará será sustituir pero no nos mostrará el resultado. Pero hay una opción p al terminar la susitución para que te devuelva el resultado. A ver como quedaría:while read l ; do per=${l%:*} num=${l#*:} tipo=$(sed -n -e "s/:${num}//p" < archivo2) echo "$per es un $tipo" done <archivo1POR FIN. FUNCIONA. El resultado que nos muestra es:Juan Perez es un Cliente Julio Gomez es un Proveedor Miguel Molina es un Franquiciado Angel Linares es un Cliente Ignacio Matas es un Cliente Lucas Pelucas es un ProveedorHe tardado una semana es conseguir que esto funcione pero ahora parece muy fácilHasta otro post :')
Comentarios
Publicar un comentario