2

在 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。

4

3 回答 3

1

你需要awk.

要获取模式范围的最后一次出现:

awk '/label1/ { r="" } /label1/,/labeln/ { r = ( r ? r RS : "") $0 } END { print r }' file

要获得模式范围的第 n 次出现:

awk -v n=2 '/label1/ { f++; r="" } f { r = (r ? r ORS : "") $0 } /labeln/ && f==n { print r; f=0 }' file

这将找到第二个匹配项 ( n=2),您可以轻松修改它以找到您想要的匹配项。


编辑:

要获取模式范围的最后一次出现:

awk '/begin/ { f=1; r=""; next } f && !/end/ { r = (r ? r ORS : "") $0 } /end/ { f=0 } END { print r }' file

要获得模式范围的第 n 次出现:

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。

于 2013-01-25T18:47:55.680 回答
1

每当您看到begin coordinates时,就开始保存新的文本块。看到时停止保存end coordinates。在文件末尾,打印您保存的最后一个文本块。

#!/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$0with \n。空格是 awk 的连接运算符。

于 2013-01-25T19:35:34.123 回答
1

当我看到“获取文件中的最后一个内容”时,我想到了tac——从下到上打印文件:

tac file | awk '
    /^begin coordinates/ {exit} 
    p {print} 
    /^end coordinates/ {p=1}
' | tac
于 2013-01-25T19:32:25.593 回答