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

Reemplazar un texto en un fichero manteniendo el formato

Estas en el tema de Reemplazar un texto en un fichero manteniendo el formato en el foro de Unix / Linux en Foros del Web. Hola, Imaginemos que tenemos un fichero con este contenido: Código: col1 col2 col3 col4 col5 col1 col2 col3 col4 col5 col1 col2 col3 col4 col5 ...
  #1 (permalink)  
Antiguo 23/03/2015, 04:05
 
Fecha de Ingreso: octubre-2008
Mensajes: 276
Antigüedad: 15 años, 5 meses
Puntos: 1
Pregunta Reemplazar un texto en un fichero manteniendo el formato

Hola,

Imaginemos que tenemos un fichero con este contenido:

Código:
col1     col2     col3     col4     col5
col1     col2     col3     col4     col5
col1     col2     col3     col4     col5
col1     col2     col3     col4     col5
colp     col2     col3     col4     col5
col1     col2     col3     col4     col5
a b col_1     col_2     col_3 col_4 col_5
a b col_1     col_2     col_3 col_4 col_5
a b col_1     col_2     col_3 col_4 col_5
El objetivo es poder cambiar un valor determinado sin perder los espacios en blanco. Por ejemplo quiero cambiar el valor 'col4' de la quinta fila por 'hello', quedaría así:

Código:
col1     col2     col3     col4     col5
col1     col2     col3     col4     col5
col1     col2     col3     col4     col5
col1     col2     col3     col4     col5
colp     col2     col3     hello    col5
col1     col2     col3     col4     col5
a b col_1     col_2     col_3 col_4 col_5
a b col_1     col_2     col_3 col_4 col_5
a b col_1     col_2     col_3 col_4 col_5
Como podemos ver las primeras 6 filas tienen un formato y las siguientes tienen otro formato.

He probado con awk pero no se mantienen los espacios:

Código:
awk '{if($1=="colp"){$4="hello"} print}' test.txt
También he probado a ejecutar un printf antes de la llamada awk de esta manera:

Código:
printf "%4s %8s %8s %8s %8s\n" $(awk '{if($1=="colp"){$4="hello"} print}' test.txt)
Pero se descolocan las tres últimas filas.

¿Cómo puedo hacer esta tarea? Entiendo que no tiene que ser tan complicado cambiar un texto de una determinada columna de una determinada fila por otro.

Saludos.
__________________
Uso Apache 2.2 con PHP 5.5.9 y MySQL 5.1
Uso Eclipse IDE for Java Developers, Version: Mars.1 Release (4.5.1), Build id: 20150924-1200 para programar en Java bajo Windows
  #2 (permalink)  
Antiguo 23/03/2015, 08:16
Avatar de lauser
Moderator Unix/Linux
 
Fecha de Ingreso: julio-2013
Ubicación: Odessa (Ukrania)
Mensajes: 3.278
Antigüedad: 10 años, 8 meses
Puntos: 401
Respuesta: Reemplazar un texto en un fichero manteniendo el formato

Awk necesita información tabular perfecta, sin huecos, no trabaja con columnas de anchura fija. De todas formas puedes obtener un output igual al input.
Código :
Ver original
  1. {
  2.     printf $NF
  3.     $NF = ""
  4.     printf " "$0"\n"
  5. }
Tienes mas información AQUÍ.
__________________
Los usuarios que te responden, lo hacen altruistamente y sin ánimo de lucro con el único fin de ayudarte. Se paciente y agradecido.
-SOLOLINUX-
  #3 (permalink)  
Antiguo 23/03/2015, 08:55
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Reemplazar un texto en un fichero manteniendo el formato

Todo depende de lo que estés necesitando hacer. Si se trata de una conversión que siempre vas a tener que hacer en la misma columna y con el mismo valor, o se trata de una conversión que necesitás hacer en cualquier columna, y por cualquier valor, periódicamente.

Por ejemplo, si los valores de todas las columnas son distintos, reemplazar 'col4' por 'hello' en la línea 5 puede ser tan fácil como
Código BASH:
Ver original
  1. sed -i.bkp '5 /col4/hello/' archivo.txt
Sed no sabe de campos separados por espacios, pero puede ser suficiente.

También podés hacer un script que envíe a AWK solamente las líneas que cumplan el formato de las primeras 3, y no las demás, o prescindir de AWK totalmente:
Código BASH:
Ver original
  1. while read LINEA; do
  2.     COL4=$(echo $LINEA | awk '{ print $4 }')
  3.     if [[ $COL4 = 'col4']]; then
  4.         echo $LINEA | sed s/col4/hello/g
  5.     else
  6.         echo $LINEA
  7.     fi
  8. done

Realmente es sorprendente y algo decepcionante que AWK pierda la línea original al acceder a uno de los campos, pero si es el comportamiento esperado no queda otra opción que trabajar con eso

Saludos.

Etiquetas: Ninguno
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 23:22.