【问题标题】:nested grep pattern search from same input file and create multiple output files从同一输入文件中进行嵌套 grep 模式搜索并创建多个输出文件
【发布时间】:2018-09-14 14:16:30
【问题描述】:

我有两个 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 循环?

预期产出

第一章.txt

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

第二章.txt

Sub Chapter1
...
Sub Chapter2
...

【问题讨论】:

  • 为了更完整,请包括您的示例输入的预期输出 thx
  • 编辑以描述示例输出文件

标签: awk sed grep


【解决方案1】:

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

【讨论】:

  • 你能解释一下这是做什么的吗:{ch++; c=a+1}
  • ch++ 增加章节计数,c=a+1 设置要打印的行数(1+ after 值)
【解决方案2】:

您的问题不清楚,但听起来您只需要:

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

如果这不是您所需要的,请编辑您的问题以包含简洁、可测试的示例输入和预期输出。现在您有点描述您的输入和输出,但我们无法对其进行测试以证明我们的脚本是否从发布的示例输入中产生了发布的预期输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-15
    • 2017-09-29
    • 2017-07-17
    • 1970-01-01
    相关资源
    最近更新 更多