打印模式之间的行,排除不匹配的模式之间的行

打印模式之间的行,排除不匹配的模式之间的行

所以我有这样的输入:

start 
abcd
sfd 
afsdaf
afsaf
end 1

start 
sdfo
efsf
end 0

start 
sdf
efsf
end 2

所以我只想打印开始和结束之间的行(包括开始和结束),但仅当行的第二个字段end大于 0 时(因此在startand end 1startand之间end 2,但不在startand之间end 0)。我有什么办法可以做到这一点吗?

答案1

$ awk -v RS= -v ORS='\n\n' '$NF' file
start
abcd
sfd
afsdaf
afsaf
end 1

start
sdf
efsf
end 2

由于您的记录由空行分隔,并且它们都以“start”开头并以“end”结尾,因此它们以“start”开头并以“end”结尾的事实是无关紧要的。我们需要考虑的是每个空行分隔段落中的最终空格分隔字段不为零,如上所示。寻找If RS is nullhttps://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html如果你不知道RS=做什么。

答案2

awk '
/start/ { toprint=$0 ; save=1; next }
save { toprint = toprint "\n" $0 ; } 
/end/ {if (($2> 0) && save) { print toprint ;} save=0 }'

当您看到“开始”行时,开始保存。如果我们要保存,则将数据附加到我们可能打印的内容中。当您看到“结束”行时,如果我们正在保存并且第二个字段大于零,则打印出我们所拥有的内容,然后停止保存。

相关内容