【发布时间】:2017-05-20 05:55:29
【问题描述】:
我正在从一个大型路由器配置文件中提取服务对象(端口/协议)。使用 awk,我希望能够获取 $5 的唯一实例并将它们打印在一行上,并在 $5 的唯一实例之后打印 $7 中的各种值,用逗号分隔。
输入数据:
set resources group port-group ServiceA port '1'
set resources group port-group ServiceA port '2'
set resources group port-group ServiceA port '3'
set resources group port-group ServiceB port '10'
set resources group port-group ServiceA port '1'
set resources group port-group ServiceA port '2'
set resources group port-group ServiceA port '3'
set resources group port-group ServiceB port '10'
set resources group port-group ServiceB port '20'
set resources group port-group ServiceC port '30'
set resources group port-group ServiceC port '40'
set resources group port-group ServiceD port '50'
set resources group port-group ServiceD port '5050'
set resources group port-group ServiceD port '60'
set resources group port-group ServiceD port '65'
set resources group port-group ServiceD port '66'
set resources group port-group ServiceD port '89'
期望的输出:
set resources group port-group ServiceA port 1, 2, 3
set resources group port-group ServiceB port 10, 20
set resources group port-group ServiceC port 30, 40
set resources group port-group ServiceD port 50, 5050, 60, 65, 66, 89
到目前为止,我尝试 awk 语句的尝试都没有结果。
我尝试过的(它是脚本的一部分,所以有 CR。)
awk '{
gsub(/[:\47]/,"")}; i=!seen[$5]++; {print i,$7 } ' inputfile.txt
这给了我以下输出:
set resources group port-group ServiceA port 1
1 1
0 2
0 3
set resources group port-group ServiceB port 8
1 8
0 1
0 2
0 3
0 8
0 3
set resources group port-group ServiceC port 2
1 2
0 3
set resources group port-group ServiceD port 8
1 8
0 5050
0 3
0 83
0 1
0 2
0 990
0 3000
0 3001
0 3002
0 3003
我假设我必须使用带有 for 循环的多维数组来完成此操作,但我被卡住了。任何帮助表示赞赏!
【问题讨论】:
-
你自己尝试了什么?
-
到目前为止,我已经尝试了 awk ' !seen[$5]++'
,但没有获得太大的吸引力。也一直在使用 gsub 从输出中删除 ' 符号,这似乎是有效的。 -
更新您的 exact 代码作为问题的一部分
-
用代码更新帖子。