我正在尝试在文本文件中提取块并将它们放到新的单个文件中。例如,请考虑以下文件:
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获取块,但很难匹配结束新行。
一种选择是编写一个循环遍历文件中每一行的脚本。我相信有更好的解决方案。有人可以帮忙吗?提前谢谢!
答案 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。