尋找並取代 awk 區塊內的文本

尋找並取代 awk 區塊內的文本

我想尋找並替換 awk 區塊內的值。

這是我的腳本的範例輸入文件

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

這是我目前正在使用的程式碼片段,

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

基本上,我的輸入檔將包含多個 P1/P3 區塊,我一次獲取一個區塊並從中找出值。現在,我基本上要做的是更改第一個 ,11 的值:1(即17,9部分之後的)化為11:2基於 17,9:10/ 的值8013765024

請注意,前後可以有多個 ,11,但這些必須保持不變。

請建議如何進一步進行。我對 awk 和 sed 都很陌生。

另外,我嘗試編寫正規表示式,但無法正確理解。這裡是,

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

答案1

試試這個 awk 指令。當 awk 找到從第 2 列開始的數字時80,它會取得下一行,然後再取得下一行,並變更其值以,11:2原樣列印其他行。

$ 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

答案2

這是一個awk解決方案:

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

答案3

這是一個可能的sed解決方案:

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

這會在找到後開始替換17,9:10/80,並首先附加+118013765024生成它+118013765024,並且它還僅替換11:111:2一次出現的11:1(範圍包括在內)

在初始文件 diff的輸出上運行顯示:sed

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

這意味著對文件的唯一更改是添加 [ +11] 以及將 [ ] 替換11:1為 [ 11:2]。讓我知道這是否正確。

相關內容