Dar formato a un archivo en unix

Tengo un archivo que tiene un header un detalle y un tariler, y estos tres tipos de registro que contiene mi archivo tienen diversas longitudes, lo que yo deseo hacer es rellenar espacios a la derecha para que la longitud de todos los registros sea la misma, pero no encuentro comandos shell/unix para poder hacer esto, ojala puedas ayudarme...

1 Respuesta

Respuesta
1
Perdóname pero no entiendo muy bien la pregunta. Mándame un ejemplo.
Tengo el shell siguiente
#********************************************************************#
# PASO 05 Graba archivo con el contenido del Header                                                     #
#********************************************************************#
VAR_06_FORMATO=`echo "05DETFACTXCOM"${VAR02_FIID_BANCO}${VAR04_DIA}${VAR03_MES}${VAR05_ANIO}`
echo ${VAR_06_FORMATO};
echo ${VAR_06_FORMATO} > ${ARCH04_HEADER_bere}
Aquí grabo un archivo con contenido XXXXXXXXXX pero quiero que supongamos el registro tiene 10 caracteres, pues que me inserte espacios para que el archivo muestre 100 caracteres, pero como hay que rellenar con espacios no se como hacerlo.
Como quien dice quiero darle formato.
VAR_09_formato_header=`wc -l ${ARCH04_HEADER_bere}| tr -s ' ' ':' | cut -f2 -d:`
Con esta variable determino de cuantos caracteres tiene el archivo, pero aquí viene mi problema.
Existe algún comando en unix para abrir el archivo y rellenar de blancos el registro, es decir,
Longitud requerida - caracteres que tiene el archivo = a espacios que se tengan que rellenar a la derecha.
Ojala me haya explicado un poco mejor, saludos
Ya te he entendido!
Se me ocurre lo siguiente. En un bucle, creas una cadena con tantos caracteres como necesites que es variable: BLANCOS_A_RELLENAR = LONG_MAX - LONG_LINEA. Y con el comando sed lo añades al final
echo $LINEA | sed "s:$:$BLANCOS_A_RELLENAR:"
Y esta nueva línea tendrá lo que deseas.
Es una pista. Perdona que no te desarrolle todo pero estoy muy liado ahora mismo y no dispongo de tiempo.
Si necesitases más ayuda, házmelo saber y cuando encuentre un hueco, me pongo a ello.
HTH
He estado haciendo pruebas y creo que ya está. Prúebalo tú mismo.
#!/usr/bin/ksh
rm $1.rellenado 2> /dev/null
# El número de caracteres máximo por línea es 10:
MAXLINEA=10
while read linea
do
# Número de caracteres por línea:
NROCAR=$(expr `echo $linea | wc -c` - 1)
# Número de caracteres con los que hay que rellenar:
cont=`expr $MAXLINEA - $NROCAR`
# Inicializo la variable RELLENO a nada!:
RELLENO=""
while [ $cont -gt 0 ]
do
# Voy rellenando con el caracter " ":
RELLENO=$RELLENO" "
cont=`expr $cont - 1`
done
# Tras saber con cuántos caracteres se ha de rellenar, los añado al final de la línea:
echo $linea | sed "s:$:$RELLENO:" >> $1.rellenado
done < $1
Para un fichero dado llamado fich1, si este script se llama rellenar. Sh, se ejecutaría como:
$ rellenar.sh fich1
Y genera la salida fich1. Rellenado con el carácter espacio en blanco al final (este script rellena a 10 caracteres como máximo, variable MAXLINEA)
Por favor, pruébalo y comprueba que es lo que tú quieres ...
Muchísimas gracias ya probé tu shell y es exactamente lo que esta tratando de hacer sin duda te calificare super, solo una cosa más, ojala puedas explicarme con piedritas, que hacen las siguientes instrucciones que no entiendo muy bien:
rm $1. Rellenado 2> /dev/null , que significa 2 > /dev/null
en el código "while read linea" donde declaras linea o es palabra reservada
"s:$:$RELLENO": que significa
Done < $1  tampoco se como interpretarlo
Gracias ten una excelente semana.
Me alegro que te haya servido!
Te explico:
rm $1.rellenado 2> /dev/null
Significa borrar el fichero de salida $1. Rellenado en el caso de que ejecutes el script más de una vez para el mismo fichero de entrada $1. El 2> /dev/null hace que la salida vaya al "limbo" y no te de un mensaje de error en el caso de que el borrado (rm) de $1. Rellenado falle porque no exista tal fichero. Es un truquillo interesante!
while read linea
Do
...
done < $1
La variable linea es cada una de las líneas del fichero que se lee (en done < $1 que cierra el while). Es un nombre de variable cualquiera. En este caso "linea" es bastante significativo, ¿verdad? En los shell scripts de UNIX no hay que declarar las variables usadas.
sed "s:$:$RELLENO:" significa añadir al final de línea ($) el contenido de la variable $RELLENO. El comando sed se suele usar para buscar y sustituir.
Espero que así ya hayas entendido lo que hace exactamente el script.
Bueno pues en verdad te estoy muy agradecida, ya termine mi programilla, no se que habría hecho sin tu ayuda, fíjate que ya incluso estaba viendo la posibilidad de usar un c en el shell para darle los espacios al header y trailer, pero definitivamente tu solución es mejor.
Bueno pues que tengas una linda semana, quizás pronto te este dando más guerra, pues estoy tratando de aprender a usar este tipo de programación...
Nuevamente agradezco tu tiempo y los conocimientos =)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas