comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

[DUDA] Reemplazar los bloques de texto en todas las combinaciones

  • 0 Respuestas
  • 865 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado psyke1

  • *
  • Underc0der
  • Mensajes: 1
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« en: Octubre 10, 2014, 05:34:32 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: No tienes permisos para ver links. Registrate o Entra con tu cuenta

Me explico:

  • El primera palabra de la línea es el número que indica el nivel.
  • Todos las variables de la líneas siguientes que tengan un nivel inferior, formarán un grupo de variables.
Ejemplo:

Código: No tienes permisos para ver links. Registrate o Entra con tu cuenta
10 HOLA.
    15 PILA PIC XX.
        20 DESBORDAMIENTO PIC X.
        20 AMIGOS PIC X.
    15 WHATSUP PIC XX.

  • La segunda palabra de la línea es el nombre del bloque de variables.
  • Un redefines funciona de la siguiente manera:
    REDEFINES NOMBRE_VAR significa que el bloque de variables de NOMBRE_VAR podría ser sustituido por el siguiente grupo de variables.

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

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

Código: No tienes permisos para ver links. Registrate o Entra con tu cuenta
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: No tienes permisos para ver links. Registrate o Entra con tu cuenta
01 SUBSCRIBERS.
    05 TYPE-OF-NAME PIC X.
    05 FILLER PIC X(100).
    05 LOL PIC 9(9).

output 2:

Código: No tienes permisos para ver links. Registrate o Entra con tu cuenta
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: No tienes permisos para ver links. Registrate o Entra con tu cuenta
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: No tienes permisos para ver links. Registrate o Entra con tu cuenta
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
  1. #!/bin/bash
  2.  
  3. awk 'BEGIN {
  4.  i=0;
  5.  j=0;
  6.  ant_l=99;
  7. } {
  8.  
  9.  campo=$4;
  10.  
  11.  if ($0 ~ /REDEFINES/) {
  12.    lvl=$1;
  13.    if (lvl < ant_l) {
  14.      ant_l=lvl
  15.    }
  16.    if ($1 > ant_l) {
  17.      arr[j]=arr[j-1]"\n";
  18.    } else {
  19.      for (x=0; x < (i-1); x++) {
  20.        arr[j]=arr[j] arrbase[x]"\n";
  21.      }
  22.    }
  23.    arr[j]=arr[j] $0"\n";
  24.    j++;
  25.  } else if ($1 > ant_l) {
  26.    arr[j-1]=arr[j-1] $0"\n";
  27.  } else {
  28.    arrbase[i]=$0;
  29.    ++i;
  30.  }
  31. }
  32.  
  33. END {
  34.  for (x=0; x<i; x++){
  35.    print arrbase[x]
  36.  }
  37.  for (x=0; x<j; x++){
  38.    print arr[x]
  39.  }
  40. }' "$1"
  41.  

Y este es el resultado:


Código: No tienes permisos para ver links. Registrate o Entra con tu cuenta
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:

Me es indiferente si la solución está en awk, phyton o perl.

Gracias.
DoEvents! :P
« Última modificación: Octubre 10, 2014, 09:20:34 am por blackdrake »

 

¿Te gustó el post? COMPARTILO!



[SOLUCIONADO] Duda con " "

Iniciado por Krisium

Respuestas: 1
Vistas: 1727
Último mensaje Junio 10, 2010, 10:50:35 am
por Xa0s
[SOLUCIONADO] Duda con Windows 7 de 32 bits & 64 bits

Iniciado por andrestoushit

Respuestas: 2
Vistas: 904
Último mensaje Marzo 15, 2016, 04:01:16 pm
por Lah-Vahn
[SOLUCIONADO] [Taller PHP] Duda taller php 1 ejercicio 4

Iniciado por arthusu

Respuestas: 2
Vistas: 1639
Último mensaje Julio 18, 2011, 07:19:33 pm
por arthusu
[SOLUCIONADO][Taller PHP] Duda taller php 2 ejercicio 2

Iniciado por Only

Respuestas: 3
Vistas: 1938
Último mensaje Agosto 05, 2011, 09:48:09 pm
por Only
[SOLUCIONADO] [Taller PHP] Duda taller php 1 ejercicio 2

Iniciado por arthusu

Respuestas: 3
Vistas: 1908
Último mensaje Julio 18, 2011, 02:20:03 am
por arthusu