【发布时间】:2016-12-19 13:33:03
【问题描述】:
我有一个看起来像这样的文件:
blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah
<empty line here>
Total DOS and NOS and partial (IT) DOSDOWN
<empty line here>
E Total 1
<empty line here>
-1.5000 0.004 0.000 0.004
-1.4953 0.004 0.000 0.004
-1.4906 0.004 0.000 0.004
-1.4859 0.004 0.000 0.004
-1.4812 0.004 0.000 0.004
0.3563 0.708 5.510 0.708
0.3609 0.562 5.513 0.562
0.3656 0.381 5.515 0.381
0.3703 0.149 5.517 0.149
<empty line here>
Sublattice 1 Atom Fe spin DOWN
我想要的是提取(第一个模式)之间的所有行
Total DOS and NOS and partial (IT) DOSUP
<empty line here>
E Total 1
<empty line here>
和(第二个模式)
<empty line here>
Sublattice 1 Atom Fe spin DOWN
即我想得到
-1.5000 0.004 0.000 0.004
-1.4953 0.004 0.000 0.004
-1.4906 0.004 0.000 0.004
-1.4859 0.004 0.000 0.004
-1.4812 0.004 0.000 0.004
0.3563 0.708 5.510 0.708
0.3609 0.562 5.513 0.562
0.3656 0.381 5.515 0.381
0.3703 0.149 5.517 0.149
所以,归根结底,我希望在两个多线模式之间有线条。
据我了解awk 可以通过状态机检测多行模式(请参阅here),但在我的情况下我没有这样做。
任何如何解决此问题的建议将不胜感激。
【问题讨论】:
-
第二个模式可以缩减为
<empty line here> -
awk -v RS= 'NR==3' file将打印第三个以空行分隔的文本块,从而产生您想要的输出 - 有什么理由不能这样做? -
@EdMorton 好一个。我把它弄得太复杂了……
-
@EdMorton 很好,但是我要查找的文本块被错误放置在一个巨大的文本文件中,只能通过“Total DOS and NOS and partial (IT) DOSUP”这一行来识别...”行“E Total 1”不是唯一的,不能使用。
-
@EdMorton ... 叹息,你又做了一次。为什么我还要在你醒着的时候回答问题? :-D