我有一个非常大的文本文件,基本上是一个消息日志,在消息之间用{
作为分隔符。如果它们满足特定条件,我想删除{
之间的块。在下面的示例中,我要删除具有EVENT_TYPE = BDE
的中间消息块,并保留两条ABC
消息。文件位于Linux机器上,因此我可以访问所有常规的grep
,sed
,awk
等。我可以使用这些过程来找到EVENT_TYPE
,但不确定如何然后找到较大的块并将其删除。
}
/type/ - DataEvents = {
VALUE = 2342
EVENT_TYPE = ABC
VALUE_YESTERDAY = 1299
HAS_DELAY = false
SEND_TIME_RT = 18:55:21.224+00:00
}
/type/ - DataEvents = {
VALUE = 889
EVENT_TYPE = BDE
VALUE_YESTERDAY = 778
HAS_DELAY = false
SEND_TIME_RT = 18:55:21.224+00:00
}
/type/ - DataEvents = {
VALUE = 123
EVENT_TYPE = ABC
VALUE_YESTERDAY = 345
HAS_DELAY = false
SEND_TIME_RT = 18:55:21.224+00:00
}
答案 0 :(得分:3)
每当输入数据具有名称=值对时,我发现为每个记录(下面的f[]
)首先创建该映射的数组(下面的rec
)是最方便/最可靠/可维护/可扩展的,并且然后按其名称访问值以进行测试,打印等。
$ cat tst.awk
BEGIN { FS=" *= *" }
NF { rec = rec $0 ORS; f[$1] = $2 }
/^}/ {
if ( f["EVENT_TYPE"] != "BDE" ) {
print rec
}
rec = ""
delete f
}
$ awk -f tst.awk file
/type/ - DataEvents = {
VALUE = 2342
EVENT_TYPE = ABC
VALUE_YESTERDAY = 1299
HAS_DELAY = false
SEND_TIME_RT = 18:55:21.224+00:00
}
/type/ - DataEvents = {
VALUE = 123
EVENT_TYPE = ABC
VALUE_YESTERDAY = 345
HAS_DELAY = false
SEND_TIME_RT = 18:55:21.224+00:00
}
答案 1 :(得分:1)
这可能对您有用(GNU sed):
sed '/{/{:a;N;/}/!ba;/EVENT_TYPE = BDE/d}' file
收集{
和}
之间的行,如果这些行包含EVENT_TYPE = BDE
,则将其删除。
答案 2 :(得分:0)
使用多字符RS的gawk,您可以将RS设置为将每个块视为一条记录,然后像往常一样在该记录内进行测试。我们使用NR > 1
来忽略从以记录分隔符开始的数据中产生的不需要的第一(空)记录(假设它确实存在,从您的部分样本中还不清楚)。
$ gawk -v RS='/type/' 'NR > 1 && !/EVENT_TYPE = BDE/ { printf "/type/%s", $0 }' file
/type/ - DataEvents = {
VALUE = 2342
EVENT_TYPE = ABC
VALUE_YESTERDAY = 1299
HAS_DELAY = false
SEND_TIME_RT = 18:55:21.224+00:00
}
/type/ - DataEvents = {
VALUE = 123
EVENT_TYPE = ABC
VALUE_YESTERDAY = 345
HAS_DELAY = false
SEND_TIME_RT = 18:55:21.224+00:00
}
答案 3 :(得分:0)
请您尝试以下。
awk '
/{/{
val=""
}
/}/{
if(found=="" && val){
print val ORS $0
}
found=val=""
next
}
/EVENT_TYPE = BDE/{
found=1
}
{
val=(val?val ORS:"")$0
}
END{
if(val && found==""){
print val ORS $0
}
}
' Input_file
答案 4 :(得分:0)
怎么样
$ vim -es '+g/EVENT_TYPE = BDE/exe "norm! dap"' '+%print' '+q!' file
输出:
}
/type/ - DataEvents = {
VALUE = 2342
EVENT_TYPE = ABC
VALUE_YESTERDAY = 1299
HAS_DELAY = false
SEND_TIME_RT = 18:55:21.224+00:00
}
/type/ - DataEvents = {
VALUE = 123
EVENT_TYPE = ABC
VALUE_YESTERDAY = 345
HAS_DELAY = false
SEND_TIME_RT = 18:55:21.224+00:00
}
答案 5 :(得分:0)
如果您是gnu sed在“ d”中的数据
sed -Ez 's/\{[^{}]*EVENT_TYPE\s*=\s*BDE[^}]*\}//' d