JSON과 같은 형식으로 저장된 일부 데이터가 있습니다.
{
{
value1: 14,
value2: 12,
value3: 1
},
{
value1: 4,
value3: -1
}
}
awk
(내 생각에 이것이 이런 종류의 문제에 가장 바람직하고 관련이 있다고 생각합니다) 또는 를 사용하여 sed
최대 "value3" 값을 가진 하위 섹션을 어떻게 얻을 수 있습니까 grep
?
따라서 다음과 같은 출력이 예상됩니다.
{
value1: 14,
value2: 12,
value3: 1
}
답변1
형식이 항상 예에 표시된 것과 같다고 가정합니다. 즉, 한 줄에 하나의 값 또는 섹션 구분 기호가 있습니다.
awk '/\{/{s="";i=1}i{s=s"\n"$0}$1=="value3:"{v=$2}/\}/{if(V==""||V<v){V=v;S=s}i=0}END{print S}' json-like.file
RS
섹션 구분 기호가 없으면 - 기반 대안이 허용됩니다.
awk -vRS='}' '{sub(/.*\{/,"")}match($0,/value3: (\S+)/,m)&&(v==""||v<m[1]){v=m[1];s=$0}END{print s}' json-like.file
- 기반 대안 RT
:
awk -vRS='\\{[^{}]+\\}' 'match(RT,/value3: (\S+)/,m)&&(v==""||v<m[1]){v=m[1];s=RT}END{print s}' json-like.file
설명하다댓글에서 요청한대로.
awk '
/\{/{s="";i=1} # start of section? reset accumulated section data; set inside section flag
i{s=s"\n"$0} # inside section? append current record to the accumulated data
$1=="value3:"{v=$2} # value3 entry? store its value
/\}/{if(V==""||V<v){V=v;S=s}i=0} # end of section? if no previous max or previous max value less than current value then set maxvalue to value and max section to section; reset inside section flag
END{print S} # output max section
' json-like.file
awk -vRS='}' ' # record separator is the end of section delimiter
{sub(/.*\{/,"")} # remove start of section delimiter and anything before it
match($0,/value3: (\S+)/,m)&&(v==""||v<m[1]){v=m[1];s=$0} # current record contains value3 entry and no previous max or previous max value is less than its value? set max value to value and section to current record
END{print s} # output section
' json-like.file
awk -vRS='\\{[^{}]+\\}' ' # record separator is an entire section
match(RT,/value3: (\S+)/,m)&&(v==""||v<m[1]){v=m[1];s=RT} # current record terminator contains value3 entry and no previous max or previous max value is less than its value? set max value to value and section to current record terminator
END{print s} # output section
' json-like.file