所以我有这样的输入:
start
abcd
sfd
afsdaf
afsaf
end 1
start
sdfo
efsf
end 0
start
sdf
efsf
end 2
所以我只想打印开始和结束之间的行(包括开始和结束),但仅当行的第二个字段end
大于 0 时(因此在start
and end 1
、start
and之间end 2
,但不在start
and之间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 null
在https://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 }'
当您看到“开始”行时,开始保存。如果我们要保存,则将数据附加到我们可能打印的内容中。当您看到“结束”行时,如果我们正在保存并且第二个字段大于零,则打印出我们所拥有的内容,然后停止保存。