首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从输出文件中提取类似文本块的第i个实例?

如何从输出文件中提取类似文本块的第i个实例?
EN

Stack Overflow用户
提问于 2013-01-26 02:19:31
回答 3查看 106关注 0票数 2

在Linux中,我有一个程序,当它经过一定数量的迭代时,它会稍微更改坐标列表。我可以使用grep -c来计算迭代次数,并且我想从该程序的输出中获取最后一组标签和坐标。

我的源文件看起来像这样:

代码语言:javascript
运行
复制
text
total number of objects with coordinates = n
text
begin coordinates
label1 x1 y1 z1
label2 x2 y2 z2
...
labeln xn yn zn
end coordinates
text
text
begin coordinates
label1 a1 b1 c1
label2 a2 b2 c2
...
labeln an bn cn
end coordinates
text
text

在本例中,我希望将标签集及其a、b和c坐标转储到一个文本文件中,如下所示:

代码语言:javascript
运行
复制
label1 a1 b1 c1
label2 a2 b2 c2
...
labeln an bn cn

我更喜欢使用grep或awk这样的工具来实现这一点,但我对它们还不够熟悉,无法实现这一点。

编辑:我忘记提到标签既不是常量也不是唯一的,所以label2可以等于label5或labeln。

EN

Stack Overflow用户

发布于 2013-01-26 02:47:56

您将需要awk

要获取模式范围的最后一个匹配项,请执行以下操作:

代码语言:javascript
运行
复制
awk '/label1/ { r="" } /label1/,/labeln/ { r = ( r ? r RS : "") $0 } END { print r }' file

要获取模式范围的第n个匹配项,请执行以下操作:

代码语言:javascript
运行
复制
awk -v n=2 '/label1/ { f++; r="" } f { r = (r ? r ORS : "") $0 } /labeln/ && f==n { print r; f=0 }' file

这将找到第二个匹配项(n=2),您可以轻松地对其进行修改以找到所需的匹配项。

编辑:

要获取模式范围的最后一个匹配项,请执行以下操作:

代码语言:javascript
运行
复制
awk '/begin/ { f=1; r=""; next } f && !/end/ { r = (r ? r ORS : "") $0 } /end/ { f=0 } END { print r }' file

要获取模式范围的第n个匹配项,请执行以下操作:

代码语言:javascript
运行
复制
awk -v n=2 '/begin/ { f++; r=""; next } f && !/end/ { r = (r ? r ORS : "") $0 } /end/ && f==n { print r; r="" }' file

这将找到第二个匹配项(n=2),您可以轻松地对其进行修改以找到所需的匹配项。HTH。

票数 1
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14527964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档