Visual Basic Foro

General => General => Mensaje iniciado por: Psyke1 en Octubre 10, 2014, 09:01:46 am

Título: [DUDA] [awk] Reemplazar los bloques de texto en todas las combinaciones
Publicado por: Psyke1 en Octubre 10, 2014, 09:01:46 am
Hola chicos, a ver si alguno me puede ayudar.

Estoy tratando de dividir unas variables COBOL para cada nivel redefine usando awk.

Hay que ver la lectura: http://programacioneinformaticafacil.blogspot.com.es/2011/07/cobol-redefines.html

Me explico:

Ejemplo:

Código: [Seleccionar]
10 HOLA.
    15 PILA PIC XX.
        20 DESBORDAMIENTO PIC X.
        20 AMIGOS PIC X.
    15 WHATSUP PIC XX.


Estoy tratando de conseguir todas las posibles combinaciones de sustituciones redefines.

Basta de teoría, veamos un ejemplo, con este input:

Código: [Seleccionar]
01 SUBSCRIBERS.
    05 TYPE-OF-NAME PIC X.
    05 FILLER PIC X(100).
    05 HELLO REDEFINES FILLER.
      10 HELLO1 PIC X(50).
      10 HELLO2 PIC X(25).
      10 HELLO3 PIC X(25).
    05 STACK REDEFINES FILLER.
      10 STACK1 PIC X(90).
      10 DERE2 PIC 9(10)
         20 DELE3 REDEFINES DERE2.
             25 DELE34 PIC X(10).
    05 LOL PIC 9(9).

Devolvería estos diferentes outputs:

output 1:

Código: [Seleccionar]
01 SUBSCRIBERS.
    05 TYPE-OF-NAME PIC X.
    05 FILLER PIC X(100).
    05 LOL PIC 9(9).

output 2:

Código: [Seleccionar]
01 SUBSCRIBERS.
    05 TYPE-OF-NAME PIC X.
    05 HELLO REDEFINES FILLER.
      10 HELLO1 PIC X(50).
      10 HELLO2 PIC X(25).
      10 HELLO3 PIC X(25).
    05 LOL PIC 9(9).

output 3:

Código: [Seleccionar]
01 SUBSCRIBERS.
    05 TYPE-OF-NAME PIC X.
    05 STACK REDEFINES FILLER.
      10 STACK1 PIC X(90).
      10 DERE2 PIC 9(10)
    05 LOL PIC 9(9).

output 4:

Código: [Seleccionar]
01 SUBSCRIBERS.
    05 TYPE-OF-NAME PIC X.
    05 STACK REDEFINES FILLER.
      10 STACK1 PIC X(90).
      20 DELE3 REDEFINES DERE2.
             25 DELE34 PIC X(10).
    05 LOL PIC 9(9).


Yo lo he intentado de la siguiente manera:

Código: (bash) [Seleccionar]
#!/bin/bash

awk 'BEGIN {
  i=0;
  j=0;
  ant_l=99;
} {

  campo=$4;

  if ($0 ~ /REDEFINES/) {
    lvl=$1;
    if (lvl < ant_l) {
      ant_l=lvl
    }
    if ($1 > ant_l) {
      arr[j]=arr[j-1]"\n";
    } else {
      for (x=0; x < (i-1); x++) {
        arr[j]=arr[j] arrbase[x]"\n";
      }
    }
    arr[j]=arr[j] $0"\n";
    j++;
  } else if ($1 > ant_l) {
    arr[j-1]=arr[j-1] $0"\n";
  } else {
    arrbase[i]=$0;
    ++i;
  }
}

END {
  for (x=0; x<i; x++){
    print arrbase[x]
  }
  for (x=0; x<j; x++){
    print arr[x]
  }
}' "$1"

Y este es el resultado:


Código: [Seleccionar]
01 SUBSCRIBERS.
  05 TYPE-OF-NAME PIC X.
  05 FILLER PIC X(100).
  05 LOL PIC 9(9).

01 SUBSCRIBERS.
  05 TYPE-OF-NAME PIC X.
  05 HELLO REDEFINES FILLER.
    10 HELLO1 PIC X(50).
    10 HELLO2 PIC X(25).
    10 HELLO3 PIC X(25).

01 SUBSCRIBERS.
  05 TYPE-OF-NAME PIC X.
  05 STACK REDEFINES FILLER.
    10 STACK1 PIC X(90).
    10 DERE2 PIC 9(10)

01 SUBSCRIBERS.
  05 TYPE-OF-NAME PIC X.
  05 STACK REDEFINES FILLER.
    10 STACK1 PIC X(90).
    10 DERE2 PIC 9(10)

      20 DELE3 REDEFINES DERE2.
        25 DELE34 PIC X(10).

Obviamente, el algoritmo está mal planteado, y no devuelve el resultado esperado.
¿Algún awk hacker en la sala?  :rolleyes:
O al menos alguna pista para desarrollar el algortimo.

Gracias.
DoEvents! :P
Título: Re:[DUDA] [awk] Reemplazar los bloques de texto en todas las combinaciones
Publicado por: raul338 en Octubre 10, 2014, 10:03:12 am
La distintas salidas que pusiste. De que dependen? De algun parametro? Deben salir todas a la vez?
Título: Re:[DUDA] [awk] Reemplazar los bloques de texto en todas las combinaciones
Publicado por: Psyke1 en Octubre 11, 2014, 06:38:19 pm
Hola Raul, cuánto tiempo amigo!  ;D

Es algo sencillo de hacer, pero complejo de explicar.

La distintas salidas que pusiste. De que dependen? De algun parametro? Deben salir todas a la vez?


Te paso aquí otro ejemplo de input/outputs, a ver si ves más claro el patrón a seguir.

Código: [Seleccionar]
    01 SUBSCRIBERS.
        05 TYPE-OF-NAME PIC X.
        05 INDIVIDUAL-NAME.
           10 LAST-NAME PIC X(12).
           10 FIRST-NAME PIC X(8).
        05 ADDRESS PIC X(20).
        05 CITY PIC X(15).
        05 STATE PIC X(2).
        05 ZIP PIC X(5).
        05 FILLER PIC X(100).
        05 HELLO REDEFINES FILLER.
          10 HELLO1 PIC X(50).
          10 HELLO2 PIC X(25).
          10 HELLO3 PIC X(25).
        05 STACK REDEFINES FILLER.
          10 STACK1 PIC X(10).
          10 STACK2 PIC X(30).
          10 STACK3 PIC X(60).
        05 HOLA PIC X(20).
        05 DERE REDEFINES HOLA.
          15 DERE1 PIC X(10).
          15 DERE2 PIC X(10).
             20 DELE3 REDEFINES DERE2.
                 25 DELE34 PIC X(10).
        05 LOL PIC 9(9).

Generaría los siguientes archivos:

Código: [Seleccionar]
output 1:

    01 SUBSCRIBERS.
        05 TYPE-OF-NAME PIC X.
        05 INDIVIDUAL-NAME.
           10 LAST-NAME PIC X(12).
           10 FIRST-NAME PIC X(8).
        05 ADDRESS PIC X(20).
        05 CITY PIC X(15).
        05 STATE PIC X(2).
        05 ZIP PIC X(5).
        05 FILLER PIC X(100).
        05 HOLA PIC X(20).
        05 LOL PIC 9(9).

output 2:

    01 SUBSCRIBERS.
        05 TYPE-OF-NAME PIC X.
        05 INDIVIDUAL-NAME.
           10 LAST-NAME PIC X(12).
           10 FIRST-NAME PIC X(8).
        05 ADDRESS PIC X(20).
        05 CITY PIC X(15).
        05 STATE PIC X(2).
        05 ZIP PIC X(5).
        05 FILLER PIC X(100).
        05 DERE REDEFINES HOLA.
          15 DERE1 PIC X(10).
          15 DERE2 PIC X(10).
        05 LOL PIC 9(9).

output 3:

    01 SUBSCRIBERS.
        05 TYPE-OF-NAME PIC X.
        05 INDIVIDUAL-NAME.
           10 LAST-NAME PIC X(12).
           10 FIRST-NAME PIC X(8).
        05 ADDRESS PIC X(20).
        05 CITY PIC X(15).
        05 STATE PIC X(2).
        05 ZIP PIC X(5).
        05 FILLER PIC X(100).
        05 DERE REDEFINES HOLA.
          15 DERE1 PIC X(10).
          20 DELE3 REDEFINES DERE2.
                 25 DELE34 PIC X(10).
        05 LOL PIC 9(9).

output 4:

    01 SUBSCRIBERS.
        05 TYPE-OF-NAME PIC X.
        05 INDIVIDUAL-NAME.
           10 LAST-NAME PIC X(12).
           10 FIRST-NAME PIC X(8).
        05 ADDRESS PIC X(20).
        05 CITY PIC X(15).
        05 STATE PIC X(2).
        05 ZIP PIC X(5).
        05 HELLO REDEFINES FILLER.
          10 HELLO1 PIC X(50).
          10 HELLO2 PIC X(25).
          10 HELLO3 PIC X(25).
        05 HOLA PIC X(20).
        05 LOL PIC 9(9).

output 5:

    01 SUBSCRIBERS.
        05 TYPE-OF-NAME PIC X.
        05 INDIVIDUAL-NAME.
           10 LAST-NAME PIC X(12).
           10 FIRST-NAME PIC X(8).
        05 ADDRESS PIC X(20).
        05 CITY PIC X(15).
        05 STATE PIC X(2).
        05 ZIP PIC X(5).
        05 HELLO REDEFINES FILLER.
          10 HELLO1 PIC X(50).
          10 HELLO2 PIC X(25).
          10 HELLO3 PIC X(25).
        05 DERE REDEFINES HOLA.
          15 DERE1 PIC X(10).
          15 DERE2 PIC X(10).
        05 LOL PIC 9(9).

output 6:

    01 SUBSCRIBERS.
        05 TYPE-OF-NAME PIC X.
        05 INDIVIDUAL-NAME.
           10 LAST-NAME PIC X(12).
           10 FIRST-NAME PIC X(8).
        05 ADDRESS PIC X(20).
        05 CITY PIC X(15).
        05 STATE PIC X(2).
        05 ZIP PIC X(5).
        05 HELLO REDEFINES FILLER.
          10 HELLO1 PIC X(50).
          10 HELLO2 PIC X(25).
          10 HELLO3 PIC X(25).
        05 DERE REDEFINES HOLA.
          15 DERE1 PIC X(10).
          20 DELE3 REDEFINES DERE2.
                 25 DELE34 PIC X(10).
        05 LOL PIC 9(9).

output 7:

    01 SUBSCRIBERS.
        05 TYPE-OF-NAME PIC X.
        05 INDIVIDUAL-NAME.
           10 LAST-NAME PIC X(12).
           10 FIRST-NAME PIC X(8).
        05 ADDRESS PIC X(20).
        05 CITY PIC X(15).
        05 STATE PIC X(2).
        05 ZIP PIC X(5).
        05 STACK REDEFINES FILLER.
          10 STACK1 PIC X(10).
          10 STACK2 PIC X(30).
          10 STACK3 PIC X(60).
        05 HOLA PIC X(20).
        05 LOL PIC 9(9).

output 8:

    01 SUBSCRIBERS.
        05 TYPE-OF-NAME PIC X.
        05 INDIVIDUAL-NAME.
           10 LAST-NAME PIC X(12).
           10 FIRST-NAME PIC X(8).
        05 ADDRESS PIC X(20).
        05 CITY PIC X(15).
        05 STATE PIC X(2).
        05 ZIP PIC X(5).
        05 STACK REDEFINES FILLER.
          10 STACK1 PIC X(10).
          10 STACK2 PIC X(30).
          10 STACK3 PIC X(60).
        05 DERE REDEFINES HOLA.
          15 DERE1 PIC X(10).
          15 DERE2 PIC X(10).
        05 LOL PIC 9(9).

output 9:

    01 SUBSCRIBERS.
        05 TYPE-OF-NAME PIC X.
        05 INDIVIDUAL-NAME.
           10 LAST-NAME PIC X(12).
           10 FIRST-NAME PIC X(8).
        05 ADDRESS PIC X(20).
        05 CITY PIC X(15).
        05 STATE PIC X(2).
        05 ZIP PIC X(5).
        05 STACK REDEFINES FILLER.
          10 STACK1 PIC X(10).
          10 STACK2 PIC X(30).
          10 STACK3 PIC X(60).
        05 DERE REDEFINES HOLA.
          15 DERE1 PIC X(10).
          20 DELE3 REDEFINES DERE2.
                 25 DELE34 PIC X(10).
        05 LOL PIC 9(9).

Muchas gracias, y un saludo.
Doevents!