Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 将文本文件中的块写入多个新文件_Linux_Bash_Awk_Sed - Fatal编程技术网

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

Linux 将文本文件中的块写入多个新文件,linux,bash,awk,sed,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 te

我试图提取文本文件中的块,并将它们放入新的单独文件中。例如,考虑以下文件:

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
ABC: this is another abc text
abc block text5
abc block text2
abc block text3
abc block text1
以及包含以下内容的abc2.txt:

ABC: this is abc text
abc block text1
abc block text2
abc block text3
ABC: this is another abc text
abc block text5
abc block text2
abc block text3
abc block text1
我试着用awk来获得方块,但在匹配新的线条时遇到了困难

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

awk '/^ABC:/,/^$/' filename
搜索所有以ABC开头的行(^表示行的开头)到任何具有空行(^$)的内容使用、到和从行


搜索所有以ABC开头的行(^表示行的开头)到任何带有空行(^$)的内容,使用、到和从行。

这一行应该可以完成以下任务:

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
kent$awk'/^ABC/{p=1;close(fn);fn=“ABC”++i}!NF{p=0}p{print>fn}'f
肯特$头abc*

==>abc1 abc2这一行应该可以完成以下工作:

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
kent$awk'/^ABC/{p=1;close(fn);fn=“ABC”++i}!NF{p=0}p{print>fn}'f
肯特$头abc*

==>abc1 abc2您的文本块被空行分隔的问题正是awks“段落模式”要处理的问题,并且通过将RS设置为空字符串激活:

awk -v RS= '/^ABC:/{print > ("abc"++c".txt")}' file
如果您没有太多的输出文件,或者您正在使用GNU awk,因为它会在必要时为您处理关闭文件,那么上述方法将起作用。如果您有很多输出文件,但无法获得GNU awk,则只需将其调整为:

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

由空行分隔的文本块问题正是awks“段落模式”要处理的问题,并通过将RS设置为空字符串激活:

awk -v RS= '/^ABC:/{print > ("abc"++c".txt")}' file
如果您没有太多的输出文件,或者您正在使用GNU awk,因为它会在必要时为您处理关闭文件,那么上述方法将起作用。如果您有很多输出文件,但无法获得GNU awk,则只需将其调整为:

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

尝试使用awk
请将该代码添加到问题中…
尝试使用awk
请将该代码添加到问题中…这不会将块分隔到不同的文件中,也不会将块分隔到不同的文件中。这是一个非常紧凑的解决方案!即使没有人问,我还是想添加一个更详细的等价物:
perl-lane'if(/^ABC/){$p=1;$I++;open$f,“>”,“ABC”。$I}if(/^$/){$p=0;close$f}if($p==1){print{$f}$}'test.txt
。虽然这将产生所需的输出,但由于awk有专门用于处理由空行分隔的数据块的段落模式,因此它比必要的更为复杂,请参阅。非常紧凑的解决方案!即使没有人问,我还是想添加一个更详细的等价物:
perl-lane'if(/^ABC/){$p=1;$I++;open$f,“>”,“ABC”。$I}if(/^$/){$p=0;close$f}if($p==1){print{$f}$}'test.txt
。虽然这将产生所需的输出,但由于awk具有段落模式,专门用于处理由空行分隔的数据块,因此它比必要的输出更复杂,请参阅。