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:102

Se 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 <archivo1
 
Esta 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 <archivo1

Vale. 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 Cliente

podrí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 <archivo1

y 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 <archivo1

Ohhhh 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 <archivo1
POR 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 Proveedor

He tardado una semana es conseguir que esto funcione pero ahora parece muy fácil

Hasta otro post :')




Comentarios

Entradas populares de este blog

Opinión sobre MIT App Inventor vs Android Studio

Mi experiencia con Node.js... 1ª Parte

Node.js is loading...