我有一个文件大致类似于
header_one
param1
param2
...
data_one
data1
data2
data3
data4
...
header_two
param1
param2
...
data_two
data1
data2
data3
data4
我想提取具有以下行的所有header
块以及具有以下行的所有块,保持它们在文件中出现的顺序并丢弃其他所有内容。N
data
M != N
如果M == N == 8
我可以这样做
grep -A8 -E "header_|data_"
但是如果我想为每个模式提供不同的上下文怎么办?
答案1
使用 awk 的临时解决方案可能是这样的:
awk '/^header_/ {n=1+1} /^data_/ {n=1+2} n-- > 0; n == 0 {print "---"}' < file
n
在匹配行上设置,并针对每行递减。当n
为正值时,将打印这些行,并在每个块后添加一个分隔符。使用上述值,它将打印header_
行加上下一行,以及data_
行加上下一行两行。
如果上下文块可以重叠,则新值n
将覆盖以前的值。为了防止这种情况,请添加条件来保护分配:
awk '/^header_/ {if (n < 2) n=2}
/^data_/ {if (n < 5) n=5}
n-- > 0; n == 0 {print "---"}' < file
这应该可以更好地处理连续行中存在data_
和 的情况。header_
答案2
我已经尝试使用下面的 sed 命令经测试它工作正常让我知道是否有任何困惑
sed -n -e '/header_/,+1p' -e '/^data_/,+2p' filename
输出
header_one
param1
data_one
data1
data2
header_two
param1
data_two
data1
data2