如何在两个相同的标记模式之间获取特定数据
Posted
技术标签:
【中文标题】如何在两个相同的标记模式之间获取特定数据【英文标题】:How to get particular data between two same marker patterns 【发布时间】:2016-05-13 16:31:17 【问题描述】:使用 awk 或 sed ,我如何选择出现在两个相同标记模式之间的行?可能有多个部分标有这些模式。
例如:假设文件包含:
$$$
lines between dollar and AT
@@@
lines between first and second AT
@@@
lines between second and third AT
@@@
lines between third and fourth AT
@@@
使用
cat 2.txt | sed -n '/$$$/,/@@@/p'
我得到了 $$$ 和第一次出现 @@@ 之间的内容。
我的疑问是,如何在 第一次和第三次出现 @@@
之间获取内容预期输出是:
lines between first and second AT
@@@
lines between second and third AT
【问题讨论】:
添加计数器,检查计数器,如果counter=value,打印数据 开始:awk '/@@@/ cnt+=1 cnt; cnt==3exit' input.txt
也许还可以在 Fredrik Pihl 评论中添加以下内容,即刮掉第一行和最后一行...awk '/@@@/ cnt+=1 cnt; cnt==3exit' sed_sample.txt | sed -e '1,1d' -e '$d'
。
【参考方案1】:
awk
似乎是完成这项工作的更明智的工具,主要是因为它允许您比 sed 更容易地在命令行上指定参数(也就是说,根本没有),并且因为它可以明智地处理数字。
我会使用
awk -v pattern='^@@@$' -v first=1 -v last=3 '$0 ~ pattern ++count; if(count == first) next count == last exit count >= first' 2.txt
它的工作原理如下:
$0 ~ pattern # When the delimiter pattern is found:
++count # increase counter.
if(count == first) # If we found the starting pattern
next # skip to next line. This handles the fencepost.
count == last # If we found the end pattern, stop processing.
exit
count >= first # Otherwise, if the line comes after the starting
# pattern, print the line.
【讨论】:
以上是关于如何在两个相同的标记模式之间获取特定数据的主要内容,如果未能解决你的问题,请参考以下文章
如何从另一个模式中获取特定的键值,通过比较它们是不是具有相同的键值?
如何选择可能使用 awk/sed 多次出现的两个标记模式之间的行