首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从同一个输入文件中搜索嵌套grep模式并创建多个输出文件。

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

Stack Overflow用户
提问于 2018-04-04 21:34:54
回答 2查看 269关注 0票数 0

我有两个grep模式

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

代码语言:javascript
复制
grep -rwA 2 [E:Chapter] input.txt > output.txt

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

代码语言:javascript
复制
grep -rwA 8 Sub\sChapter input.txt > chapter1.txt

else go to next match for pattern1

示例输入文件:

代码语言:javascript
复制
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.... 

我正试图解析一个包含许多章节的大文本,其中一些章节包含了子章节。我希望为包含分章节的章节创建单独的输出文件,这些子章节名为第1.txt、第2.txt,等等。要创建,那么我想转储大约8行的每个子章节下各自的章节文件。比如使用grep -rwA 8..。

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

预期产出

Chapter1.txt

代码语言:javascript
复制
Sub Chapter1
bla bla bla
...about 8 lines here.
Sub Chapter2
...
Sub Chapter3
...

Chapter2.txt

代码语言:javascript
复制
Sub Chapter1
...
Sub Chapter2
...
EN

回答 2

Stack Overflow用户

发布于 2018-04-04 21:51:36

awk去营救!

由于您的示例输入不会区分-A8选项,所以我使用了-A1等效项。

代码语言:javascript
复制
$ awk -v a=1 '/E:chapter/   {ch++; c=a+1} 
              /Sub Chapter/ {c=a+1} 
              c&&c--        {print > "Chapter"ch}' file

会给

代码语言:javascript
复制
==> 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

更新以添加标头

代码语言:javascript
复制
$ 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在每个块的末尾。

票数 0
EN

Stack Overflow用户

发布于 2018-04-05 00:28:42

你的问题还不清楚,但听起来你需要的是:

代码语言:javascript
复制
awk '/E:chapter/{close(out); out="chapter"++c} {print > out}' input.txt

如果这不是您需要的内容,那么编辑您的问题,以包括简洁、可测试的示例输入和预期输出。现在,您正在描述您的输入和输出,但是没有什么可以对其进行测试,以证明我们的脚本是否从发布的示例输入中生成了预期的输出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49660820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档