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이 됩니다.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
하고 먼저 생성하기 +11
위해 추가하며 첫 번째 발생 (범위 포함) 만 교체합니다.8013765024
+118013765024
11:1
11:2
11:1
초기 파일 의 출력을 실행하면 diff
다음이 표시됩니다.sed
19c19
< 17,9:10/+118013765024
---
> 17,9:10/8013765024
21c21
< ,11:2
---
> ,11:1
즉, 파일에 대한 유일한 변경 사항은 [ ]를 추가 하고 [ ]를 [ ]로 +11
바꾸는 것 입니다 . 이것이 맞는지 알려주세요.11:1
11:2