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 블록이 포함되며, 한 번에 한 블록씩 가져와서 그로부터 가치를 찾아냅니다. 이제 기본적으로 하고 싶은 일은 first ,11의 값을 변경하는 것입니다.1(즉, 17,9 부분 이후의 것)을 11로:217,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+11801376502411:111:211:1

및 초기 파일 diff의 출력을 실행하면 다음이 표시됩니다.sed

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

즉, 파일에 대한 유일한 변경 사항은 [ ]를 추가 하고 [ ] +11를 [ ]로 대체하는 것입니다 . 이것이 맞는지 알려주세요.11:111:2

관련 정보