[英]Parsing json with awk/sed in bash to get key value pair
我已經在SO上閱讀了許多現有的問題,但是沒有一個問題可以回答我所尋找的問題。 我知道很難使用sed / awk在bash中解析json,但是在每條記錄的鍵值對的整個列表中,每條記錄只需要幾個鍵值對。 我想這樣做,是因為它更快,因為主要的JSON擁有數百萬條記錄,因此相當大。
JSON格式如下:
{
"documents":
[
{
"title":"a", //needed
"description":"b", //needed
"id":"c", //needed
....(some more:not useful)....
"conversation":
[
{
"message":"",
"id":"d", //not needed
.....(some more)....
"createDate":"e", //not needed
},
...(some more messages)....
],
"createDate":"f", //needed
....(many more labels).....
}
],
....(some more global attributes)....
}
現在,為此,我需要標記為需要的屬性,但是它們的通用密鑰使通過簡單的sed / awk獲取成為一個問題。 誰能建議我們可以用sed / awk做到這一點。 如果可能的話,任何幫助實現這一目標的方法將不勝感激。
PS:我了解jsawk
但我不想引入任何依賴關系,因此,如果可能,請建議使用sed / awk。
編輯:下面給出的格式的多個擴展(如文檔中我們有一個列表)
"title":"a",
"description":"b"
"id":"c"
"createDate":"f"
編輯:JSON沒有任何空格。 它已被格式化以提高可讀性。
我建議您使用“ jq”或真正的JSON解析器。 您不能使用任意正則表達式來“解析” JSON。 您可以使用awk破解某些內容,但是如果您輸入的內容出乎意料,那將很容易中斷。
因此,答案是,引入一個廉價的依賴項(jq或類似工具),並圍繞該腳本編寫腳本。 除非您在路由器或嵌入式計算機上運行此腳本,否則很容易安裝jq。
如果關鍵字符[
和{
, {
, }
和]
始終在每一行中隔離,則將起作用:
#!/usr/bin/awk -f
function walk(level, end) {
while (getline > 0) {
if (level && $NF ~ end) {
return
}
if ($NF == "{") {
walk(level + 1, "},?")
} else if ($NF == "[") {
walk(level + 1, "],?")
} else if (level == 3 && match($0, /"(title|description|id|createDate)":"[^"]*"/)) {
print substr($0, RSTART, RLENGTH)
}
}
}
BEGIN {
walk(0)
exit
}
輸入:
{
"documents":
[
{
"title":"a", //needed
"description":"b", //needed
"id":"c", //needed
....(some more:not useful)....
"conversation":
[
{
"message":"",
"id":"d", //not needed
.....(some more)....
"createDate":"e", //not needed
},
...(some more messages)....
],
"createDate":"f", //needed
....(many more labels).....
}
],
....(some more global attributes)....
}
輸出:
"title":"a"
"description":"b"
"id":"c"
"createDate":"f"
好吧,如果您要使用正則表達式來解析JSON,而JSON本質上會快速,骯臟並且嚴重依賴於輸入文件的確切語法,則您可以編寫一些內容,該內容取決於在輸入文件之前出現的空白量您感興趣的鍵值對。根據您要尋找的輸出類型,可以使用以下方法:
awk '/^ {12}"title/
/^ {12}"description/
/^ {12}"id/
/^ {12}"createDate/' input_file.json
不太好,但是可以解決您的示例輸入問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.