這是我擁有的一些資料:
animal {
dog {
body {
parts {
legs = old
brain = average
tail= curly
}
}
}
cat {
body {
parts {
legs = new
brain = average
tail {
base=hairy
tip=nothairy
}
}
}
}
}
請注意,資料并不是真正的 json,因為它具有以下規則:
- 支持
=或=在鍵值對之間。 - 沒有
"或,貫穿整個資料。資料的分離是基于新行。
甚至可以用 awk 或 sed 決議它嗎?我試過jq但它不起作用,因為這不是真正的 json 資料。
我的目標是只顯示“狗”和“貓”。基于它們是“動物”下的最高價值。
$ some-magical-command
dog
cat
uj5u.com熱心網友回復:
要執行您當前想要的操作并方便將來對資料進行任何操作,您可以使用任何 POSIX awk(用于字符類)將您的結構轉換為 JSON,然后jq在其上使用:
$ cat tst.awk
BEGIN { print "{" }
!NF { next }
{
sub(/[[:space:]] $/,"")
gsub(/[[:alnum:]_] /,"\"&\"")
gsub(/ *= */,": ")
sub(/" *{/,"\": {")
}
( nr) > 1 {
sep = ( /"/ && (prev ~ /["}]$/) ? "," : "" )
printf "%s%s%s", prev, sep, ORS
}
{ prev = $0 }
END { print prev ORS "}" }
$ awk -f tst.awk file
{
"animal": {
"dog": {
"body": {
"parts": {
"legs": "old",
"brain": "average",
"tail": "curly"
}
}
},
"cat": {
"body": {
"parts": {
"legs": "new",
"brain": "average",
"tail": {
"base": "hairy",
"tip": "nothairy"
}
}
}
}
}
}
當前和一些可能的未來用途:
$ awk -f tst.awk file | jq -r '.animal | keys[]'
cat
dog
$ awk -f tst.awk file | jq -r '.animal.dog.body.parts | keys[]'
brain
legs
tail
$ awk -f tst.awk file | jq -r '.animal.dog.body.parts'
{
"legs": "old",
"brain": "average",
"tail": "curly"
}
$ awk -f tst.awk file | jq -r '.animal.cat.body.parts'
{
"legs": "new",
"brain": "average",
"tail": {
"base": "hairy",
"tip": "nothairy"
}
}
以上假設您的輸入始終如您的問題所示。
uj5u.com熱心網友回復:
它相當接近tcl語法,如果您想學習一門新語言。
set data {
animal {
dog {
body {
parts {
legs = old
brain = large
tail= curly
}
}
}
cat {
body {
parts {
legs = new
brain = tiny
tail {
base=hairy
tip=nothairy
}
}
}
}
}
}
set data [regsub -line -all {\s*=\s*(. )} $data { "\1"}]
dict get $data animal dog body parts brain ;# => large
我知道有些人會爭論你對狗腦和貓腦的分類......
uj5u.com熱心網友回復:
如果您只需要二級鍵,并且您不太關心為錯誤輸入生成好的錯誤訊息,那么它非常簡單。基本思想是這樣的:
輸入行有三種格式:
- ID {
- ID = value # 其中 = 可能不是空格分隔的
- }
在讀取行時,我們通過使用第一種行型別遞增計數器并使用第三種行型別遞減它來跟蹤嵌套深度。
當嵌套計數器為 1 時,如果該行有一個
ID欄位,我們列印它。
這可以通過 awk 腳本非常簡單地完成。該腳本應保存在一個檔案中,其名稱為level2_keys.awk; 然后就可以執行命令了awk -f level2_keys.awk /path/to/input/file。請注意,所有規則都以 結束,next;以避免在評估匹配后出現規則。
$1 == "}" { # Decrement nesting on close
--nesting;
next;
}
/=/ { # Remove the if block if you don't want to print these keys.
if (nesting == 1) {
gsub("=", " = "); # Force = to be a field
print($1);
}
next;
}
$2 == "{" { # Increment nesting (and maybe print) on open
if (nesting == 1) print($1);
nesting;
next;
}
# NF is non-zero if the line is not blank.
NF { print "Bad input at " NR ": '"$0"'" > "/dev/stderr"; }
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/457901.html
