Encontrar e substituir texto dentro do bloco awk

Encontrar e substituir texto dentro do bloco awk

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 80na coluna2, ele obtém a próxima linha e depois a próxima linha e altera seu valor para ,11:2imprimir 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 awksolução:

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

Responder3

Aqui está uma sedsoluçã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/80e anexá-la primeiro +11e 8013765024também +118013765024substitui 11:1apenas 11:2pela primeira ocorrência de 11:1(o intervalo é inclusivo)

A execução diffna saída do sedarquivo 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.

informação relacionada