Re: Sustituir en base de datos de texto en bash
On Tue, Jun 30, 2015 at 11:46:24AM -0500, Debia Linux wrote:
> Listeros:
>
> Buenos dias tengan todos ustedes.
>
> Tengo una base de datos en un archivo de texto que manejo en bash
> (solo he podido ingresar los datos con un script sencillo mediante
> comando echo y read).
>
> La estructura del la base de datos (productos.db) es:
>
> CODIGO PRODUCTO|NOMBRE DE PRODUCTO|PAIS ORIGEN|DESCRIPCION|
> 124564_78789888878|CALCULADORA||CALCULADORA DIGITAL CON 15 DIGITOS|
>
> Como podran ver en la columna 3 (pais de origen no existe pais de
> origen esta en "blanco" (por decirlo de alguna manera.
>
> ¿Como puedo hacerle mediante algun comando para ingresar el nombre del
> pais (ya que en su momento no sabiamos el pais donde se mando a hacer)
> justamente en la columna tres.
>
> mediante egrep puedo aislar la linea de este producto (porque son
> muchos productos con un codigo diferente.
>
> egrep 124564_78789888878 productos.db > tmp0
>
>
> Ya tengo aislada la linea y ahora ¿Cómo le hago?. Podria yo usar tal
> vez awk pero no se como funcionaria.
>
> Gracias por su ayuda.
Hola:
Si la estructura de las tuplas que no cuentan con el campo 3 cumple con
que siempre habrá un "||" cuando no esté el país, con sed podrías
intentar:
sed '/^124564_78789888878/s/||/|ATLANTIDA|/' productos.db > productos.alt
Pero eso debieras aplicarlo para cada uno de los productos que deseas
actualizar. Algo en el estilo:
sed '
/^124564_78789888878/s/||/|ATLANTIDA|/
/^124564_78789888868/s/||/|MORDOR|/
/^124564_78789888848/s/||/|ARRAKIS|/' productos.db > productos.alt
Una opción que quizás pueda resultar menos engorrosa sería:
1. Crea una segunda base de datos, con la estructura:
CODIGO PRODUCTO|PAIS ORIGEN|
124564_78789888878|ATLANTIDA|
Puedes llamarla pais_productos.db y detallar todos los códigos con su
respectivo país.
2. Ejecutar un `join' entre las dos bases:
$ join -a 1 -t'|' productos.db pais_productos.db > actualizacion_productos.db
3. Hecho el `join', los campos que fueron unidos entre ambas bases
tendrán un campo extra, respecto a los productos que ya tenían la
columna PAIS ORIGEN con información, por lo que puedes usar awk para
hacer las modificaciones adecuadas:
awk '
BEGIN { FS="|"; OFS="|" }
NF != 6 { print }'
NF == 6 { print $1, $2, $5, $4, $6 }' actualizacion_productos.db
Eso se me ocurre por ahora. No ejecutes esto a ciegas, pues no lo he
verificado y probablemente tenga alguna falla que debas corregir. Lee el
manual de `join', pues es necesario que las dos bases de datos que vayas
a emplear se encuentren ordenadas por el campo del código de producto
(join toma el campo 1 por omisión), por lo que tal vez debas valerte de
sort para tales menesteres.
Saludos.
--
Pablo Jiménez
Reply to: