2012-07-24 76 views
2

假设我有文件:awk中 - 再次使用特定的行来匹配模式

1Alorem 
2ipsuml 
3oremip 
4sumZAl 
5oremip 
6sumlor 
7emZips 

我想从包含于含有范围Z匹配行的行拆分文本:

/A/,/Z/ { 
print > "rangeX.txt" 
} 

我希望这个特定输入给我2个文件:

1Alorem 
2ipsuml 
3oremip 
4sumZAl 

4sumZAl 
5oremip 
6sumlor 
7emZips 

问题在于第4行仅在广告匹配作为范围的结束时才被采用,但第2范围从未启动是因为其他行中没有A。

有没有办法再次尝试对所有的模式匹配4号线或告诉的awk,它已经开始新的范围是多少?

感谢

回答

2

阿恩指出,第二部分将不会被捕获,但目前的模式。这是没有范围的替代方案。

awk 'p==0 {p= (~/A/)>0;filenr++} p==1 {print > "range"filenr".txt"; p= (~/Z/)==0; if(!p && ~/A/){filenr++;;p=1; print > "range"filenr".txt"}}' test.txt 

它还可以处理两个以上的部分

1

所有你需要做的是第一范围的最后一行保存到一个变量,然后重新打印变量,具有以下区间上沿,对第二个文件。

换句话说,因为你刚刚经历的每一行循环,在定义一个空变量为BEGIN,然后通过每一次更新。当范围结束时,您将把变量保存为最后一行。在再次开始之前,将该行写入下一个文件。

+0

我会假设第二范围将无法启动... – 2012-07-24 08:43:20

+0

@KarlNordström,你是什么意思? – Dan 2012-07-24 08:50:21

+0

@KarlNordström,我刚刚给我的答案加了一些说明,如果有帮助的话。 – Dan 2012-07-24 09:02:31

1

没有办法复赛战绩,但是写模式的变体是一种选择。这里第二范围从图案含有A线和Z到线含有Ž但匹配不是A:

awk "/A/,/Z/ {print 1, $0} (/A/ && /Z/),(/Z/ && !/A/) {print 2, $0}" 

打印:

1 1Alorem 
1 2ipsuml 
1 3oremip 
1 4sumZAl 
2 4sumZAl 
2 5oremip 
2 6sumlor 
2 7emZips 

作为你的样品是位合成不知如果该解决方案适合您的真正问题。