嵌套的grep模式从同一输入文件中搜索并创建多个输出文件

时间:2018-04-04 21:34:55

标签: awk sed grep

我有两个grep模式

首先做pattern1 - (搜索主要章节)

grep -rwA 2 [E:Chapter] input.txt > output.txt

然后检查pattern2(搜索子章节),if pattern2 exists

grep -rwA 8 Sub\sChapter input.txt > chapter1.txt

else go to next match for pattern1

示例输入文件:

bla bla E:chapter1
bla bla bla bla bla
bla bla bla bla bla
Sub Chapter bla bla bla
bla bla bla
Sub chapter bla bla bla
bla....
bla bla E:chapter2
bla bla bla bla bla
Sub Chapter bla bla bla
bla bla bla
Sub chapter bla bla bla
bla.... 

我正在尝试解析一个包含许多章节的大文本,其中一些包含子章节。我想为章节创建单独的输出文件,其中包含名为chapter1.txt,chapter2.txt等的子章节。 。要创建,然后我想在各自的章节文件下转储大约8行每个子章节..就像使用grep -rwA 8 ..

我该怎么做? awk和while循环?

预期产出

  

Chapter1.txt

Sub Chapter1
bla bla bla
...about 8 lines here.
Sub Chapter2
...
Sub Chapter3
...
  

Chapter2.txt

Sub Chapter1
...
Sub Chapter2
...

2 个答案:

答案 0 :(得分:0)

awk救援!

由于您的示例输入无法区分-A8选项,因此我使用了-A1等效项。

$ awk -v a=1 '/E:chapter/   {ch++; c=a+1} 
              /Sub Chapter/ {c=a+1} 
              c&&c--        {print > "Chapter"ch}' file

将给出

==> Chapter1 <==
bla bla E:chapter1
bla bla bla bla bla
Sub Chapter bla bla bla
bla bla bla

==> Chapter2 <==
bla bla E:chapter2
bla bla bla bla bla
Sub Chapter bla bla bla
bla bla bla

<强>更新 添加标题

$ awk -v a=1 '/E:chapter/   {file="Chapter"++ch".txt"; 
                             print "Chapter"ch > file; 
                             sc=0; c=a+1} 
              /Sub Chapter/ {c=a+1; 
                             print "Sub Chapter"++sc > file} 
              c&&c--        {print > file}' file


==> Chapter1.txt <==
Chapter1
bla bla E:chapter1
bla bla bla bla bla
Sub Chapter1
Sub Chapter bla bla bla
bla bla bla

==> Chapter2.txt <==
Chapter2
bla bla E:chapter2
bla bla bla bla bla
Sub Chapter1
Sub Chapter bla bla bla
bla bla bla

如果要跳过存在章和子章节行的实际行,请在每个块的末尾添加; next

答案 1 :(得分:0)

您的问题不明确,但听起来您只需要:

awk '/E:chapter/{close(out); out="chapter"++c} {print > out}' input.txt

如果这不是您需要的,那么编辑您的问题以包含简洁,可测试的样本输入和预期输出。现在你有点描述你的输入和输出但我们没有什么可以运行测试来证明我们的脚本是否产生了发布的样本输入的预期输出。