我的模式分布在多个线上,有很多类似的模式。我需要在发现的每一个此类Mutli线模式匹配下进行进一步处理。
下面的命令是我正在尝试的一个:
cat file_with_match | grep -Pv '^$' | sed -nre '/Pure delay/I,/END OF PATH/Ip'
这给出了所有匹配。我想操纵每个过程和进一步的过程。
我的文件如下:
纯延迟路径#308,
0.003 0.003 0.032 0.003(f)0.003 AF MCLK
0.019 0.022 0.006 0.001(f)0.022 AF MCLK
路径结束
纯延迟路径#309,
0.003 0.003 0.032 0.003(f)0.003 AF MCLK
0.019 0.022 0.006 0.001(f)0.022 AF MCLK
路径结束
这只是用于解释。然后,我将需要在每个Mutli线匹配中添加所有第一列,然后将其与#id
一起打印找不到如何处理。任何帮助都非常感谢!
gnu awk 解决方案,考虑到以下考虑:
- ID可能会不止一次出现。所有值$ 1将被求和。
- ID可能不会顺序,因此您可能会在中间找到一些"孔"。
- 应按顺序打印ID。
脚本:
$ cat tst.awk
match($0, /Pure delay path #([0-9]+)/, arr){
id=arr[1] # save id
low=(low && low<id?low:id); high=(high<id?id:high) # save lowest/highest id
next
}
id { a[id]=a[id]+$1 } # sum up $1 for id
/END OF PATH/{ id=0 }
END{
for (i=low; i<=high; i++)
if (i in a) # check if id is defined
printf "id: #%s sum: %*.3fn", i, length(a[i]), a[i]
}
测试数据:
$ cat input.txt
Pure delay path #333,
0.003 0.003 0.032 0.003 (F) 0.003 af mclk
123.019 0.022 0.006 0.001 (F) 0.022 af mclk
END OF PATH
Pure delay path #309,
0.003 0.003 0.032 0.003 (F) 0.003 af mclk
0.019 0.022 0.006 0.001 (F) 0.022 af mclk
END OF PATH
Pure delay path #308 ,
0.003 0.003 0.032 0.003 (F) 0.003 af mclk
0.019 0.022 0.006 0.001 (F) 0.022 af mclk
END OF PATH
Pure delay path #309,
0.003 0.003 0.032 0.003 (F) 0.003 af mclk
123.019 0.022 0.006 0.001 (F) 0.022 af mclk
END OF PATH
结果:
$ awk -f tst.awk input.txt
id: #308 sum: 0.022
id: #309 sum: 123.044
id: #333 sum: 123.022
如果您不考虑上述3个注意事项,则脚本可以更简单,因此:
$ cat tst2.awk
match($0, /Pure delay path #([0-9]+)/, arr){
id=arr[1]
next
}
id { a[id]=a[id]+$1 }
/END OF PATH/{
printf "id: #%s sum: %*.3fn", id, length(a[id]), a[id]
}
这可能对您有用(gnu sed):
sed -n '/Pure delay/I{:a;N;/END OF PATH/I!ba;s/match/replace/gp}' file
使用循环:a;N;/match/!ba
收集所需的线,然后以下任何内容都可以处理收集的行,即s/match/replacement/gp
。
n.b。最终命令应为 p
或 P
命令/标志,否则不会打印任何内容。