基于子行文件的一行和打印其他行直到它到达下一行

gee*_*.24 1 bash perl

我有一个文本文件,其中包含多个条目,如下所示:

# 2018 11 21 17 47 37.708756 -34.390213 116.803673 2.6972 0.442474 3.324627 2.840390 0.885880 890
LM01 0.836408 1.00 P
LM01 1.035398 1.00 S
LM03 3.987074 1.00 S
# 2018 11 22 11 58 25.550581 -34.439400 116.750832 2.8513 0.288144 3.306790 2.576028 0.771026 891
LM01 1.664419 1.00 P
LM01 2.471786 1.00 S
LM03 3.536432 1.00 P
# 2018 11 22 14 38 7.190175 -34.447819 116.788727 3.1661 0.577347 2.063253 2.132511 0.608057 892
LM01 1.629825 1.00 P
LM02 3.059825 1.00 P
LM03 3.284825 1.00 P
LM01 2.378885 1.00 S
Run Code Online (Sandbox Code Playgroud)

我需要想出一种方法,最好是在Bash或Perl中,用#基于第8列(纬度)的行子集读取行,如果满足条件,则打印其余行(例如LM .. .)直到它到达下一行#.例如,我只想打印第8列<-34.4的"条目",并包含该条目的LM*行.

我可以拿出代码来读取每一#行,但我不确定如何编程"如果满足条件,打印LM行直到你到达下一行#行".预期的产出是:

# 2018 11 22 11 58 25.550581 -34.439400 116.750832 2.8513 0.288144 3.306790 2.576028 0.771026 891
LM01 1.664419 1.00 P
LM01 2.471786 1.00 S
LM03 3.536432 1.00 P
# 2018 11 22 14 38 7.190175 -34.447819 116.788727 3.1661 0.577347 2.063253 2.132511 0.608057 892
LM01 1.629825 1.00 P
LM02 3.059825 1.00 P
LM03 3.284825 1.00 P
LM01 2.378885 1.00 S
Run Code Online (Sandbox Code Playgroud)

zdi*_*dim 5

#如果标志打开,则在不以print 开头的行上,否则根据条件设置标志(和打印)

perl -wlnE'
    if (/^\s*[^#]/) { say if $y } elsif ((split)[7] < -34.4) { $y=1, say }
' file
Run Code Online (Sandbox Code Playgroud)

使用提供的样本输入file打印预期输出.

-lnE可以-ne改为使用标志,print而不是say代码.这-w只是警告,经常在单行中省略(我总是使用它).请参阅perlrun中的命令开关