将文本文件中的块写入多个新文件

时间:2017-07-14 08:29:17

标签: linux bash awk sed

我正在尝试在文本文件中提取块并将它们放到新的单个文件中。例如,请考虑以下文件:

some junk lines

ABC: this is abc text
abc block text1
abc block text2
abc block text3

I dont care about this line

Text at start of block. I dont want this line also. 
ABC: this is another abc text
abc block text5
abc block text2
abc block text3
abc block text1

some other dont care line

我对ABC'感兴趣块。每个街区都有" ABC:"在开始时和最后的新行。所以,我想生成包含以下内容的abc1.txt:

ABC: this is abc text
abc block text1
abc block text2
abc block text3

和abc2.txt包含:

ABC: this is another abc text
abc block text5
abc block text2
abc block text3
abc block text1

我尝试使用awk获取块,但很难匹配结束新行。

一种选择是编写一个循环遍历文件中每一行的脚本。我相信有更好的解决方案。有人可以帮忙吗?提前谢谢!

3 个答案:

答案 0 :(得分:4)

这个单行应该做的工作:

awk '/^ABC/{p=1;close(fn);fn="abc"++i}!NF{p=0}p{print > fn}' file

以您的示例作为输入:

kent$  awk '/^ABC/{p=1;close(fn);fn="abc"++i}!NF{p=0}p{print > fn}' f

kent$  head abc*
==> abc1 <==
ABC: this is abc text
abc block text1
abc block text2
abc block text3

==> abc2 <==
ABC: this is another abc text
abc block text5
abc block text2
abc block text3
abc block text1

注意:

  • close(fn)是必要的,如果您有许多“ABC”块,否则您会收到错误信息,例如“打开的文件太多”

答案 1 :(得分:1)

由空行分隔的文本块的问题正是awks&#34;段模式&#34;存在以处理并通过将RS设置为空字符串来激活:

awk -v RS= '/^ABC:/{close(f); f="abc"++c".txt"; print > f}' file

如果您没有大量输出文件或者您使用GNU awk,上面的内容将会有效,因为它会在必要时为您处理关闭文件。如果您确实有很多输出文件但是无法获得GNU awk,那么您只需将其调整为:

{{1}}

答案 2 :(得分:-2)

awk '/^ABC:/,/^$/' filename

搜索所有以ABC开头的行:(^表示行的开头)到任何带空行的行(^ $)使用,to to lines to from。