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 80
en la columna 2, obtiene la siguiente línea y luego la siguiente línea y cambia su valor para ,11:2
imprimir 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 awk
solución:
$ awk -F '/|:' '
$3 == "8013765024" {flag = 1}
$0 == ",11:1" && flag {$2 = 2;flag = 0}
1
' OFS=':' file
Respuesta3
Aquí hay una posible sed
solució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/80
y agregar por primera vez +11
para 8013765024
realizarla +118013765024
y también reemplaza solo 11:1
con la primera aparición de (el rango es inclusivo)11:2
11:1
Al ejecutarse diff
en la salida del sed
y 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.