Como filtrar los registros de una entidad

Lo que pasa que tengo un archivo de entrada.txt el cual contiene la siguiente linea de 160 caracteres
C 00002490056220090615299564289400091016720000000001200FEB0003001606013192009120110403501003615422459740000000000000000000000000000000000000000000000000
numero 1 tengo que validad el tamaño de la linea tiene que ser 160 caracteres
numero 2 todos los que son EB0003 pasalor a otro archivo
eso es fácil con un simple código como este
cat C98009120122.TOT | awk '{if (substr($0,59,6) == "EB0003") print $0}' > C98009120122_0003.TOT
lo que deses e slo siguiente : nombre del prog "extrac_ent.awk"
BEGIN {                 
  ent=substr($0,59,6)   aca capturo el EB0003
}                       
{        
Acá lo que quiero es poder escoger si es 0002, 0003, 0004 etc y que los imprima en otro archivo pero ese print no me funciona
  if (ent=="EB0002"){   
      printf "%s\n",$0  
  }                     
}                       
END {                   
}
este es el prog que llama al awk de arriba
                                                
#*******************************************************                  
#*Programa que extrae la entidad del C980AAMMDD22.TOT  *                    
#*******************************************************                                                                                             
#primero ponemos una variable con la ruta donde estara el archivo de entrada
arch=/export/home/sixmain/file_out/$1                                       
#este if verifica si has puesto el parametro de entrada                     
if [ "$arch" = "" ]; then                                                   
  echo "Falta archivo de entrada"                                           
  exit 1                                                                    
else                                                                        
#este if verifica si existe el archivo de entrada                           
  if ! [ -f "$arch" ]; then                                                 
    echo "Archivo no existe: $arch"                                         
    exit 1                                                                  
  fi                                                                        
fi                                                                          
cat $arch | awk -f extrac_ent.awk > C980entidad.TOT

1 respuesta

Respuesta
1
Por lo que veo precisas validar los tamaños de las lineas y dividir los registros según la entidad en distintos archivos.
El codigo del awk deberia ser asi
Escribo el BEGIN aunque no es necesario para este caso, para que no cometas el error de leer aquí la entidad, ya que el begin solo se ejecuta al comienzo de la lectura del archivo, y no por cada linea.
Entonces pregunto por el tamaño de la linea, si es 160 luego pregunto por lo que hay en la posición 59-60, si es EB tomo el el valor de las posiciones 59-64 y lo guardo en ent, por ultimo imprimo la linea completa en un archivo con nombre variable según el valor de ent.
Aquí va el código del awk
BEGIN {
}
{
   if (length($0) == 160) {
      if (substr($0,59,2) == "EB" ) {
         ent=substr($0,59,6);
         print $0 > ent ".txt";
      }
   }
}
Estimado claudio tu apoyo me sirvió de mucho solo que me olvide de un detalle el tamaño de los registros pueden ser 160 o 333 osea que los que tenga EB002 y sean 160 y 333 de tamaño que lo guarden en un archivo.
Gracias de antemano
Otra pregunta viste que yo llamo mi programa awk con un script, tu sabrás com hacer para que de mi script llame a mi programa pero dándole parámetros.
Por ejemplo si ves en mi script yo pongo así:
Nombre del script nombre del archivo de entrada (como parámetro $1)
Lo que quiero es poner com oparametro el archivo de entrada y la entidad EB002
¿Me entiendes?
Espero puedas ayudarme te lo agradecería mucho pero te vuelvo a decir gracias por la primera ayuda
Y ante todo perdón por la demora en responder.
Sobre el tema de que puedan ser de 160 o 333 creo que basta con un or en el if principal
en lugar de  if (length($0) == 160) {
poner if (length($0) == 160 || length($0) == 333) {
El segundo tema interpreto que lo que quieres es pasarle un parametro al awk, si asi fuera se hace de la siguiente forma
echo "hola " | awk -v nombre="claudio" '{print $0 " " nombre}'
Desdepues del -v pudes poner la cantidad que quiereas de variable="valor" separadas por espacios, y dentro del awk las usas con el nombre que le diste.
Eres un experto de verdad tus conocimientos me sirvieron de mucho,
en verdad gracias por tu tiempo espero contar con tu ayuda en otras ocasiones.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas