色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

awk json字符串 扁平化

錢諍諍1年前7瀏覽0評論

awk是一種強大的文本處理工具,而JSON則是一種輕量級的數據交換格式,由于awk的強大處理能力以及JSON格式的便利性,使用awk解析JSON字符串并將其扁平化是非常有用的。

我們可以使用awk的字符串處理函數和結構化函數來解析JSON字符串。首先,我們需要將JSON字符串轉換成awk可識別的格式,可以使用sed或者awk自帶的gsub函數進行轉換:

awk -v json='{"name":"Alice","age":20,"address":{"country":"China","province":"Guangdong"},"friends":["Bob","Cathy"]}' '
BEGIN {
gsub(/["{}]/,"",json);
gsub(/[:,]/," ",json);
split(json,a," ");
for(i in a)
print a[i]
}'

以上代碼將JSON字符串轉換為一系列的關鍵字和值,其中每一對關鍵字和值構成了一個字段。接下來,我們需要使用awk的結構化函數來扁平化這個JSON字符串,這里我們使用一個遞歸函數flatten:

function flatten(json,  prefix="") {
for(i=1; i<=length(json); i++) {
if(json[i] ~ /^[0-9]/) {
printf("%s[%d] %s\n",prefix,i,json[i]);
}
else if(json[i+1] == "{") {
sub(/"/,"",json[i]);
sub(/"/,"",json[i+2]); 
printf("%s%s.%s\n",prefix,json[i],json[i+2]);
sub(/^[^{]*\{/,"",json);
flatten(json, prefix json[i] ".");
return;
}
else if(json[i+1] == "[") {
sub(/"/,"",json[i]);
printf("%s%s\n",prefix,json[i]);
sub(/^[^[]*\[/,"",json);
flatten(json, prefix json[i] "[%d]");
return;
}
else {
sub(/^"/,"",json[i]);
sub(/"$/,"",json[i]);
printf("%s%s %s\n",prefix,json[i],json[i+1]);
i++;
}
}
}
json='{"name":"Alice","age":20,"address":{"country":"China","province":"Guangdong"},"friends":["Bob","Cathy"]}'
BEGIN {
gsub(/["{}]/,"",json);
gsub(/[:,]/," ",json);
split(json,a," ");
flatten(a);
}

flatten函數接受一個json數組和一個前綴字符串作為輸入,將json數組扁平化成一系列的鍵值對,并在鍵名前添加前綴字符串。該函數通過遞歸來處理嵌套的JSON結構,當遇到嵌套的對象或數組時,會繼續調用自身處理。

最終執行以上代碼會輸出如下結果:

name Alice
age 20
address.country China
address.province Guangdong
friends[1] Bob
friends[2] Cathy

以上就是使用awk將JSON字符串扁平化的實現過程,可以大大方便我們對JSON字符串進行處理和分析。