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

标签 linux text command-line awk grep

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

我的源文件看起来像:

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 坐标转储到一个文本文件中,如下所示:

label1 a1 b1 c1
label2 a2 b2 c2
...
labeln an bn cn

我更喜欢使用 grep 或 awk 之类的工具来执行此操作,但我对它们还不够熟悉,无法实现此操作。

编辑:我忘了提及标签既不是恒定的也不是唯一的,因此 label2 可以等于 label5 或 labeln。

最佳答案

每当您看到开始坐标时,就开始保存新的文本 block 。当您看到结束坐标时停止保存。在文件末尾,打印您保存的最后一个文本 block 。

#!/usr/bin/env awk -f

/^begin coordinates/ { text = ""; save = 1 }
save { text = text $0 "\n" }
/^end coordinates/ { save = 0 }
END { print text }

请注意,text = text $0 "\n" 将变量 text$0\n 连接起来>。空格是 awk 的连接运算符。

关于linux - 如何从输出文件中提取类似文本 block 的第 i 个实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14527964/

相关文章:

javascript - 如何直接根据用户输入更改输入框中的特定文本?

javascript - jQuery 中的编号

Python:从命令输出中读取

linux - 为什么我的 Dockerfile CMD 不起作用?

html - 将长电子邮件地址包装在小盒子中

linux - openembedded-core 和 poky 的区别

asp.net - 无法让 AWS Elastic Beanstalk 命令行工具在 Windows 8 上运行。出现以下 PowerShell 错误?

postgresql - 在不中断当前连接的情况下重新加载 postgreSQL?

linux - 为什么我不是从bind()而是从listen()得到EADDRINUSE?

c - 在 C 中设置 open() 系统调用的权限