如果块内的文本包含CRITERIA,我想在PATTERN1和PATTERN2之间选择块,否则丢弃整个块。
示例任务: 选择PATTERN1 ='开始'之间的文字。和PATTERN2 ='结束',如果'之间的某些文字开始'并且'结束'匹配CRITERIA =' DCE',然后在' start'之间输出整个块。并且'结束'。
示例输入:
start
123
ABC
123
end
start
123
DCE
123
end
start
123
EFG
123
end
示例输出:
start
123
DCE
123
end
我使用awk尝试了以下操作,但无法找到如何在两种模式之间使用CRITERIA:
awk '/start/,/end/' input_file
答案 0 :(得分:2)
由于起始块由空的rexords分隔,因此您可以使用它们进行分隔。这里有awk:
$ awk 'BEGIN{RS=""}/DCE/' file
start
123
DCE
123
end
修改:由于空记录根本不在那里,让我们与end
分开:
$ awk 'BEGIN{RS=ORS="end\n"}/DCE/' file
start
123
DCE
123
end
答案 1 :(得分:2)
编辑: 根据OP,Input_file也可能在末尾匹配,并且可能没有结束字符串,因此现在也按照这样添加代码。
awk '
/start/{
if(val) { print value };
flag=1;
value=val=""}
/[dD[cC][eE]/ && flag { val=1 }
/end/ { flag="" }
flag{
value=value?value ORS $0:$0
}
END{
if(val) { print value }}
' Input_file
<强> 说明: 强>
awk '
/start/{ ##Looking for string start in a line if found then do following.
if(val) { print value }; ##Checking if variable val is NOT NULL, if yes then print variable of value.
flag=1; ##Setting variable named flag as 1 here.
value=val=""} ##Nullifying variables value and val here.
/[dD[cC][eE]/ && flag { val=1 } ##Searching string DCE/dce in a line and checking if variable flag is NOT NULL then set variable val as 1.
/end/ { flag="" } ##Searching string end in current line, if found then Nullifying flag here.
flag{ ##Checking if variable named flag is SET or NOT NULL here.
value=value?value ORS $0:$0 ##Creating value whose value is current line value and concatenating in its own value.
}
END{ ##Starting END block of awk here.
if(val) { print value }} ##Checking if variable val is NOT NULL then print variable value here.
' Input_file
您能否请关注awk
并告诉我这是否对您有所帮助。
awk '/start/{if(val){print value};flag=1;value=val=""} /[dD[cC][eE]/ && flag{val=1} /end/{flag=""} {value=value?value ORS $0:$0}' Input_file
此处也添加非单线形式的解决方案。
awk '
/start/{
if(val) { print value };
flag=1;
value=val=""}
/[dD[cC][eE]/ && flag{ val=1 }
/end/ { flag="" }
{
value=value?value ORS $0:$0
}
' Input_file