![需要在不同文件中打印匹配行](https://linux22.com/image/69302/%E9%9C%80%E8%A6%81%E5%9C%A8%E4%B8%8D%E5%90%8C%E6%96%87%E4%BB%B6%E4%B8%AD%E6%89%93%E5%8D%B0%E5%8C%B9%E9%85%8D%E8%A1%8C.png)
例如,我有这样的数据
1111111
test1
test2
test3
1111111
block 1
block 2
block 3
1111111
page1
page2
page3
我想将内容打印为不同的文件,如下所示。
Test1 - File
1111111
test1
test2
test3
Block - File2
1111111
block 1
block 2
block 3
Page - File3
1111111
page1
page2
page3
答案1
那么您想将这个文件拆分为11111111
,对吗?
尝试
awk -vRS=1111111 'NR>1{print RS$0 >"file"NR-1}' file
答案2
csplit -zf file file.txt /^1111111/ "{*}"
csplit
(coreutils) 是一个很好的命令,用于按上下文行分割文件(行数、模式)
答案3
awk
文件中没有标题的另一种可能:
awk '/^1111111/ { close("file" i); i++; } { print > "file" i; }' file
第二个带有标题,因为我假设标题是从第一个提交之后构造的,1111111
尽管最后一个似乎不是这样的:
awk '/^1111111/ { close(f); i++; s = $1; next; } { if (s) { f = "file" i; header = toupper(substr($1, 1, 1)) substr($1, 2) " - File" i; print header ORS s > f; s = ""; } print > f; }' file
答案4
这应该适合你
#!/usr/bin/perl
use strict;
use warnings;
my$in=shift(@ARGV);
my$filecount=0;
my$open=0;
open(IN,'<',$in) or die $!;
while(<IN>) #reading input file
{
if($_=~/^111/) #start new output file, if a line begins with multiple 1s
{
close OUT or die $! if $open==1;
$filecount++;
open(OUT,'>','out-'.$filecount.'.txt') or die $!;
$open=1;
print OUT $_;
}
else
{
print OUT $_;
}
}
close IN or die $!;
close OUT or die $!;
我确信有更有效的方法,但这是我首先想到的:-)