Encontrar y reemplazar texto dentro del bloque awk

Encontrar y reemplazar texto dentro del bloque awk

Quiero encontrar y reemplazar un valor dentro del bloque awk.

Aquí hay un archivo de entrada de muestra para mi script.

P1
10,9:11/18013013582
,10:1
,167:0
,487:5/E.164
11,9:15/310410532169026
,10:60
,167:0
,487:4/IMSI
12,18:15/013329002130500
,19:0
15,9:10/9609610015
,10:1
,14:68
,167:0
,436:5/ABCDE
,487:5/E.164
16,87:1
17,9:10/8013765024
,10:1
,11:1
,12:0
,167:0
,487:5/E.164
23,9:11/13123149810
,10:1
,11:1
,167:0
,487:5/E.164
P3
42,3:1.
,4:3
,300:1.
43,3:1.
,4:3
,300:1.
44,3:0.
,4:7
,300:0.
45,5:0.3

Y aquí está el fragmento de código que estoy usando actualmente,

nawk -v fname="${filename}" -F '/|:' '

    function isnum(x){return(x==x+0)}

    /P1/,/P3/{
            # Found start increment i reset variables go to next line
            if(/P1/){
                   ++i 
                   fid ="" 
                   count++
                   next
                }

            # Found end validate variable and print go to next line
            if(/P3/){
                printf "%s|",count
                printf "%s|",isnum(fid)?fid:"NULL"
                  next 
                }
            if(!fid && /36,59:*/)
                {
                    fid = $NF
                }
        ' ${filename} >>output.txt

Básicamente, mi archivo de entrada contendrá varios bloques P1/P3, estoy tomando un bloque a la vez y descubriendo su valor. Ahora, lo que quiero hacer básicamente es cambiar el valor de primero,11:1(es decir, el que está después de la parte 17,9) en 11:2basado en el valor de 17,9:10/8013765024.

Tenga en cuenta que puede haber varios 11 antes y después, pero deben permanecer sin cambios.

Sugiera cómo continuar. Soy muy nuevo tanto en awk como en sed.

Además, intenté escribir una expresión regular pero no pude descifrarla correctamente. Aquí lo tienes,

17[,0-9:\]*[\n]*,11

Respuesta1

Pruebe este comando awk. Siempre que awk encuentra un número que comienza 80en la columna 2, obtiene la siguiente línea y luego la siguiente línea y cambia su valor para ,11:2imprimir las otras líneas tal como están.

$ awk -F/ '$2~/^80/{print; getline; print; getline; $1=",11.2"}1' file1.txt
P1
10,9:11/18013013582
,10:1
,167:0
,487:5/E.164
11,9:15/310410532169026
,10:60
,167:0
,487:4/IMSI
12,18:15/013329002130500
,19:0
15,9:10/9609610015
,10:1
,14:68
,167:0
,436:5/ABCDE
,487:5/E.164
16,87:1
17,9:10/8013765024
,10:1
,11.2
,12:0
,167:0
,487:5/E.164
23,9:11/13123149810
,10:1
,11:1
,167:0
,487:5/E.164
P3
42,3:1.
,4:3
,300:1.
43,3:1.
,4:3
,300:1.
44,3:0.
,4:7
,300:0.
45,5:0.3

Respuesta2

Aquí hay una awksolución:

$ awk -F '/|:' '
    $3 == "8013765024" {flag = 1}
    $0 == ",11:1" && flag {$2 = 2;flag = 0}
    1
' OFS=':' file

Respuesta3

Aquí hay una posible sedsolución:

    sed  '/17,9:10\/80/,/11:1/ {
          s/8013765024/+118013765024/
          s/11:1/11:2/ }' file.txt

Esto inicia la sustitución después de encontrar 17,9:10/80y agregar por primera vez +11para 8013765024realizarla +118013765024y también reemplaza solo 11:1con la primera aparición de (el rango es inclusivo)11:211:1

Al ejecutarse diffen la salida del sedy el archivo inicial se muestra:

    19c19
    < 17,9:10/+118013765024
    ---
    > 17,9:10/8013765024
    21c21
    < ,11:2
    ---
    > ,11:1

lo que significa que los únicos cambios en el archivo son la adición de [ +11] y la sustitución de [ 11:1] por [ 11:2]. Déjame saber si esto es correcto.

información relacionada