Quero encontrar e substituir um valor dentro do bloco awk.
Aqui está um exemplo de arquivo de entrada para meu 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
E aqui está o trecho de código que estou usando atualmente,
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
Basicamente, meu arquivo de entrada conterá vários blocos P1/P3, estou pegando um bloco de cada vez e descobrindo o valor dele. Agora, o que quero fazer basicamente é alterar o valor de first ,11:1(ou seja, aquele após a parte 17,9) em 11:2com base no valor de 17,9:10/8013765024.
Observe que pode haver vários 11 antes e depois, mas eles devem permanecer inalterados.
Por favor, sugira como proceder. Eu sou muito novo no awk e no sed.
Além disso, tentei escrever uma expressão regular, mas não consegui entendê-la corretamente. Aqui está,
17[,0-9:\]*[\n]*,11
Responder1
Experimente este comando awk. Sempre que o awk encontra um número começando 80
na coluna2, ele obtém a próxima linha e depois a próxima linha e altera seu valor para ,11:2
imprimir as outras linhas como estão.
$ 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
Responder2
Aqui está uma awk
solução:
$ awk -F '/|:' '
$3 == "8013765024" {flag = 1}
$0 == ",11:1" && flag {$2 = 2;flag = 0}
1
' OFS=':' file
Responder3
Aqui está uma sed
solução possível:
sed '/17,9:10\/80/,/11:1/ {
s/8013765024/+118013765024/
s/11:1/11:2/ }' file.txt
Isso inicia a substituição depois de encontrá-la 17,9:10/80
e anexá-la primeiro +11
e 8013765024
também +118013765024
substitui 11:1
apenas 11:2
pela primeira ocorrência de 11:1
(o intervalo é inclusivo)
A execução diff
na saída do sed
arquivo inicial mostra:
19c19
< 17,9:10/+118013765024
---
> 17,9:10/8013765024
21c21
< ,11:2
---
> ,11:1
o que significa que as únicas alterações no arquivo são a adição de [ +11
] e a substituição de [ 11:1
] por [ 11:2
]. Deixe-me saber se isso está correto.