假设我有文件:
1Alorem
2ipsuml
3oremip
4sumZAl
5oremip
6sumlor
7emZips
我想将包含A的行中的文本拆分为包含Z匹配范围的行:
/A/,/Z/ {
print > "rangeX.txt"
}
我希望这个特定的输入能给我2个文件:
1Alorem
2ipsuml
3oremip
4sumZAl
和
4sumZAl
5oremip
6sumlor
7emZips
问题是第4行仅在广告匹配作为范围结束时获取,但第2范围永远不会启动,因为其他行中没有A.
有没有办法尝试再次将第4行与所有模式匹配,或者告诉awk它必须启动新范围?
由于
答案 0 :(得分:2)
正如Arne指出的那样,第二部分不会被抓住,而是当前的模式。这是一个没有范围的替代方案。
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 :(得分:1)
您需要做的就是将第一个范围的最后一行保存到变量,然后为第二个文件重新打印该变量以及以下范围。
换句话说,由于您只是循环遍历每一行,因此在BEGIN中定义一个空变量,然后每次更新它。当范围结束时,您将变量保存为最后一行。在重新开始之前将该行写出到下一个文件。
答案 2 :(得分:1)
无法重新匹配记录,但编写模式的变体是一种选择。这里,第二个范围模式从包含A和Z的行匹配到包含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
由于您的样本有点合成,我不知道该解决方案是否符合您的实际问题。