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