我想查找并替换 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
,并首先附加+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
]。让我知道这是否正确。