Linux下如何使用awk解析json資料
近期在做一個專案,呼叫api後返回了一個巢狀較多層的json格式的資料,常規解析json的方式也已經很難或做不到提取出需要的資訊點,恰好對awk比較熟悉,考慮到awk本身也是一種用於資料處理的工具,於是就有了以下用awk解析json的嘗試。下面以face++ 的detect api返回值,json格式:
{ "faces": [ { "face_token": "826536dba3973d71d219a15e18c9597b", "face_rectangle": { "height": 113, "left": 198, "top": 125, "width": 113 }, "attributes": { "age": { "value": 26 }, "gender": { "value": "Female" } }, "landmark": { "mouth_upper_lip_bottom": { "x": 257, "y": 203 }, "right_eye_upper_right_quarter": { "x": 284, "y": 142 }, "left_eyebrow_upper_right_quarter": { "x": 235, "y": 127 }, "mouth_upper_lip_right_contour3": { "x": 267, "y": 202 }, "left_eye_top": { "x": 228, "y": 143 }, "nose_contour_right3": { "x": 265, "y": 185 }, "contour_right6": { "x": 298, "y": 207 }, "mouth_lower_lip_bottom": { "x": 257, "y": 211 }, "nose_contour_right2": { "x": 268, "y": 172 }, "nose_contour_right1": { "x": 264, "y": 149 }, "nose_contour_left3": { "x": 250, "y": 185 }, "nose_contour_left2": { "x": 246, "y": 172 }, "nose_contour_left1": { "x": 249, "y": 150 }, "right_eyebrow_upper_right_quarter": { "x": 286, "y": 128 }, "left_eyebrow_upper_middle": { "x": 226, "y": 126 }, "right_eye_upper_left_quarter": { "x": 273, "y": 143 }, "right_eyebrow_right_corner": { "x": 292, "y": 133 }, "contour_right8": { "x": 283, "y": 227 }, "right_eyebrow_upper_left_quarter": { "x": 271, "y": 127 }, "contour_right2": { "x": 309, "y": 159 }, "contour_right3": { "x": 309, "y": 172 }, "contour_right1": { "x": 309, "y": 147 }, "left_eye_lower_left_quarter": { "x": 222, "y": 149 }, "contour_left1": { "x": 201, "y": 150 }, "contour_left2": { "x": 201, "y": 162 }, "contour_left3": { "x": 203, "y": 175 }, "contour_left4": { "x": 205, "y": 187 }, "contour_left5": { "x": 209, "y": 199 }, "contour_left6": { "x": 215, "y": 210 }, "contour_left7": { "x": 224, "y": 220 }, "right_eye_bottom": { "x": 280, "y": 149 }, "right_eye_lower_right_quarter": { "x": 284, "y": 148 }, "right_eyebrow_left_corner": { "x": 266, "y": 132 }, "right_eyebrow_upper_middle": { "x": 279, "y": 126 }, "mouth_lower_lip_top": { "x": 257, "y": 205 }, "right_eyebrow_lower_left_quarter": { "x": 272, "y": 132 }, "left_eyebrow_lower_left_quarter": { "x": 219, "y": 133 }, "mouth_upper_lip_left_contour3": { "x": 247, "y": 203 }, "left_eyebrow_lower_middle": { "x": 226, "y": 132 }, "left_eye_upper_left_quarter": { "x": 222, "y": 144 }, "mouth_upper_lip_left_contour1": { "x": 252, "y": 198 }, "mouth_upper_lip_top": { "x": 257, "y": 199 }, "mouth_upper_lip_left_contour2": { "x": 244, "y": 200 }, "right_eye_pupil": { "x": 279, "y": 145 }, "mouth_lower_lip_right_contour1": { "x": 267, "y": 204 }, "mouth_lower_lip_left_contour2": { "x": 242, "y": 207 }, "mouth_lower_lip_right_contour3": { "x": 265, "y": 210 }, "mouth_lower_lip_right_contour2": { "x": 272, "y": 206 }, "contour_chin": { "x": 259, "y": 237 }, "contour_left9": { "x": 245, "y": 235 }, "left_eye_lower_right_quarter": { "x": 233, "y": 150 }, "mouth_left_corner": { "x": 236, "y": 202 }, "contour_right4": { "x": 307, "y": 184 }, "contour_right7": { "x": 291, "y": 217 }, "left_eyebrow_left_corner": { "x": 211, "y": 135 }, "nose_right": { "x": 272, "y": 181 }, "nose_tip": { "x": 257, "y": 177 }, "contour_right5": { "x": 303, "y": 196 }, "nose_contour_lower_middle": { "x": 258, "y": 187 }, "right_eye_top": { "x": 278, "y": 141 }, "mouth_lower_lip_left_contour3": { "x": 249, "y": 210 }, "right_eye_right_corner": { "x": 288, "y": 146 }, "mouth_upper_lip_right_contour1": { "x": 261, "y": 198 }, "mouth_upper_lip_right_contour2": { "x": 270, "y": 199 }, "right_eyebrow_lower_right_quarter": { "x": 285, "y": 132 }, "left_eye_left_corner": { "x": 218, "y": 148 }, "mouth_right_corner": { "x": 278, "y": 201 }, "right_eye_lower_left_quarter": { "x": 275, "y": 149 }, "left_eyebrow_right_corner": { "x": 242, "y": 132 }, "left_eyebrow_lower_right_quarter": { "x": 234, "y": 132 }, "right_eye_center": { "x": 279, "y": 146 }, "left_eye_pupil": { "x": 228, "y": 146 }, "nose_left": { "x": 243, "y": 182 }, "mouth_lower_lip_left_contour1": { "x": 247, "y": 204 }, "left_eye_upper_right_quarter": { "x": 233, "y": 145 }, "right_eyebrow_lower_middle": { "x": 279, "y": 132 }, "left_eye_center": { "x": 228, "y": 148 }, "contour_left8": { "x": 233, "y": 228 }, "contour_right9": { "x": 272, "y": 234 }, "right_eye_left_corner": { "x": 270, "y": 149 }, "left_eyebrow_upper_left_quarter": { "x": 218, "y": 128 }, "left_eye_bottom": { "x": 227, "y": 150 }, "left_eye_right_corner": { "x": 237, "y": 149 } } } ], "time_used": 251, "request_id": "1492784536,22b21204-0e1e-4071-91ba-b29e5a68fe03", "image_id": "6kox5v0GjhI9f+MWEc3wIA==" }
我們從呼叫api開始講起,以下是我對face++的一個呼叫,直接運用shell命令的curl傳送的post請求:
curl -X POST "https://api-cn.faceplusplus.com/facepp/v3/detect" \ -F "api_key=RF_13WYz9Cgz9KXtJxaqAIbIF7_jxuC-" \ -F "api_secret=MeCM2hq-SSiWXgxMt-JcpOo-t5IAIdz4" \ -F "[email protected]/home/gec/timg.jpeg" \ -F "return_landmark=1" -F "return_attributes=gender,age"
為了方便接下來awk對資料的解析,我們可以將呼叫api的返回值重定向到一個檔案裡,將以上命令改寫成:
curl -X POST "https://api-cn.faceplusplus.com/facepp/v3/detect" \ -F "api_key=RF_13WYz9Cgz9KXtJxaqAIbIF7_jxuC-" \ -F "api_secret=MeCM2hq-SSiWXgxMt-JcpOo-t5IAIdz4" \ -F "[email protected]/home/gec/timg.jpeg" \ -F "return_landmark=1" -F "return_attributes=gender,age" >face
如此,當呼叫成功時,我們就可以在face中看到face++的detect api的正確返回值,檢視檔案用cat指令或者直接用文字編輯器開啟都可以,如下:
cat face
{"image_id": "6kox5v0GjhI9f+MWEc3wIA==", "request_id": "1492784536,22b21204-0e1e-4071-91ba-b29e5a68fe03", "time_used": 251, "faces": [{"landmark": {"mouth_upper_lip_left_contour2": {"y": 200, "x": 244}, "mouth_upper_lip_top": {"y": 199, "x": 257}, "mouth_upper_lip_left_contour1": {"y": 198, "x": 252}, "left_eye_upper_left_quarter": {"y": 144, "x": 222}, "left_eyebrow_lower_middle": {"y": 132, "x": 226}, "mouth_upper_lip_left_contour3": {"y": 203, "x": 247}, "left_eyebrow_lower_left_quarter": {"y": 133, "x": 219}, "right_eyebrow_lower_left_quarter": {"y": 132, "x": 272}, "right_eye_pupil": {"y": 145, "x": 279}, "mouth_lower_lip_right_contour1": {"y": 204, "x": 267}, "mouth_lower_lip_left_contour2": {"y": 207, "x": 242}, "mouth_lower_lip_right_contour3": {"y": 210, "x": 265}, "mouth_lower_lip_right_contour2": {"y": 206, "x": 272}, "contour_chin": {"y": 237, "x": 259}, "contour_left9": {"y": 235, "x": 245}, "left_eye_lower_right_quarter": {"y": 150, "x": 233}, "mouth_lower_lip_top": {"y": 205, "x": 257}, "right_eyebrow_upper_middle": {"y": 126, "x": 279}, "right_eyebrow_left_corner": {"y": 132, "x": 266}, "right_eye_lower_right_quarter": {"y": 148, "x": 284}, "right_eye_bottom": {"y": 149, "x": 280}, "contour_left7": {"y": 220, "x": 224}, "contour_left6": {"y": 210, "x": 215}, "contour_left5": {"y": 199, "x": 209}, "contour_left4": {"y": 187, "x": 205}, "contour_left3": {"y": 175, "x": 203}, "contour_left2": {"y": 162, "x": 201}, "contour_left1": {"y": 150, "x": 201}, "left_eye_lower_left_quarter": {"y": 149, "x": 222}, "contour_right1": {"y": 147, "x": 309}, "contour_right3": {"y": 172, "x": 309}, "contour_right2": {"y": 159, "x": 309}, "mouth_left_corner": {"y": 202, "x": 236}, "contour_right4": {"y": 184, "x": 307}, "contour_right7": {"y": 217, "x": 291}, "left_eyebrow_left_corner": {"y": 135, "x": 211}, "nose_right": {"y": 181, "x": 272}, "nose_tip": {"y": 177, "x": 257}, "contour_right5": {"y": 196, "x": 303}, "nose_contour_lower_middle": {"y": 187, "x": 258}, "right_eye_top": {"y": 141, "x": 278}, "mouth_lower_lip_left_contour3": {"y": 210, "x": 249}, "right_eye_right_corner": {"y": 146, "x": 288}, "mouth_upper_lip_right_contour1": {"y": 198, "x": 261}, "mouth_upper_lip_right_contour2": {"y": 199, "x": 270}, "right_eyebrow_lower_right_quarter": {"y": 132, "x": 285}, "left_eye_left_corner": {"y": 148, "x": 218}, "mouth_right_corner": {"y": 201, "x": 278}, "right_eye_lower_left_quarter": {"y": 149, "x": 275}, "left_eyebrow_right_corner": {"y": 132, "x": 242}, "left_eyebrow_lower_right_quarter": {"y": 132, "x": 234}, "right_eye_center": {"y": 146, "x": 279}, "left_eye_pupil": {"y": 146, "x": 228}, "nose_left": {"y": 182, "x": 243}, "mouth_lower_lip_left_contour1": {"y": 204, "x": 247}, "left_eye_upper_right_quarter": {"y": 145, "x": 233}, "right_eyebrow_lower_middle": {"y": 132, "x": 279}, "left_eye_center": {"y": 148, "x": 228}, "contour_left8": {"y": 228, "x": 233}, "contour_right9": {"y": 234, "x": 272}, "right_eye_left_corner": {"y": 149, "x": 270}, "left_eyebrow_upper_left_quarter": {"y": 128, "x": 218}, "left_eye_bottom": {"y": 150, "x": 227}, "left_eye_right_corner": {"y": 149, "x": 237}, "right_eyebrow_upper_left_quarter": {"y": 127, "x": 271}, "contour_right8": {"y": 227, "x": 283}, "right_eyebrow_right_corner": {"y": 133, "x": 292}, "right_eye_upper_left_quarter": {"y": 143, "x": 273}, "left_eyebrow_upper_middle": {"y": 126, "x": 226}, "right_eyebrow_upper_right_quarter": {"y": 128, "x": 286}, "nose_contour_left1": {"y": 150, "x": 249}, "nose_contour_left2": {"y": 172, "x": 246}, "nose_contour_left3": {"y": 185, "x": 250}, "nose_contour_right1": {"y": 149, "x": 264}, "nose_contour_right2": {"y": 172, "x": 268}, "mouth_lower_lip_bottom": {"y": 211, "x": 257}, "contour_right6": {"y": 207, "x": 298}, "nose_contour_right3": {"y": 185, "x": 265}, "left_eye_top": {"y": 143, "x": 228}, "mouth_upper_lip_right_contour3": {"y": 202, "x": 267}, "left_eyebrow_upper_right_quarter": {"y": 127, "x": 235}, "right_eye_upper_right_quarter": {"y": 142, "x": 284}, "mouth_upper_lip_bottom": {"y": 203, "x": 257}}, "attributes": {"gender": {"value": "Female"}, "age": {"value": 26}}, "face_rectangle": {"width": 113, "top": 125, "left": 198, "height": 113}, "face_token": "826536dba3973d71d219a15e18c9597b"}]}
原本json結構是相當清晰的,每條資料都會按行分開,但是經實驗Linux下(也可能不是環境原因,這裡不是很清楚,還請朋友們不吝指正)返回的json是不分行的,所有資料都擠在一行上,這對解析來說無疑又加大了難度。接下來嘗試從json當中提取需要的資訊,以年齡age為例。如果資訊太多覺得不好找,可以用grep指令標記一下,這樣就可以很方便的找到關鍵詞的所在位置:
grep age face
博主最初的思路是:awk能不能通過匹配到age這個詞,然後輸出當前位置若干字元後的字串26?博主按這個思路嘗試了很久,同時也發現網上有很多朋友問過類似的問題,但是都得不到答案,大概awk本身並沒有能直接實現這種需求的語法吧。
我最終想出來的方法是awk指定分隔符結合管道運用,指定 所需資料附近的符號 作為分隔符將原json資料切塊,越切越小,切到最後保留的那塊資料就是我們想要的資料。
這個方法的優點在於無視了json格式的多層巢狀進行了直接切塊,完整指令如下:
awk -F '"' '{print $(NF-14)}' face|awk -F} '{print $1}'|awk -F:' ' '{print $2}'
將上面的指令剖析開來
第一步:
awk -F '"' '{print $(NF-14)}' face #指定引號為分隔符,列印倒數第14個欄位
得到:
: 26}},
第二步,基於上面的結果再進行:
awk -F} '{print $1}' #指定}為分隔符,列印第1個欄位
得到:
: 26
第三步,基於上面結果再進行:
awk -F:' ' '{print $2}' #指定:和空格 為分隔符,列印第2個欄位
得到結果:
26
至此,awk順利提取得到了json格式中的資料。由於json格式都是差不多的形式,指定分隔符加管道的方法同樣適用於其他api返回資料的解析,僅需修改欄位數即可。
相關推薦
Linux下如何使用awk解析json資料
近期在做一個專案,呼叫api後返回了一個巢狀較多層的json格式的資料,常規解析json的方式也已經很難或做不到提取出需要的資訊點,恰好對awk比較熟悉,考慮到awk本身也是一種用於資料處理的工具,於是就有了以下用awk解析json的嘗試。下面以face++ 的detect
springMVC框架下JQuery傳遞並解析Json資料
json作為一種輕量級的資料交換格式,在前後臺數據交換中佔據著非常重要的地位。Json的語法非常簡單,採用的是鍵值對錶示形式。JSON 可以將 JavaScript 物件中表示的一組資料轉換為字串,然後就可以在函式之間輕鬆地傳遞這個字串,或者在非同步應用程式中將字串從 We
linux下awk日誌分析
linux 接口 記錄 video 文本命令數據分析假設線上倒出的接口訪問日誌有上百行,該日誌的記錄格式如下:/data1/www/logs/archives/170524/170524.v6.weibo.com_10.72.13.113.0.cn.gz:v6.weibo.com 123.12
linux下awk內置函數的使用(split/substr/length)
ref inux ada 聯網 ssi 人力 car sep ron 一、split 初始化和類型強制 awk的內建函數split允許你把一個字符串分隔為單詞並存儲在數組中。你可以自己定義域分隔符或者使用現在FS(域分隔符)的值。格式: spli
linux下命令行json工具: jq
linux下命令行json工具: jqyum install jq -y 前提json:{"php":[{"name":"a1","age":15},{"name":"a2","a
c語言建立和解析json資料
之前一篇有說到使用lincurl庫獲取網頁資料,那麼問題來了,當我們獲取到的資料大多是json的格式,應該怎麼解析出我們需要的欄位呢?下面我們使用json-glib庫來對json資料進行建立和解析。 #include<json-glib/json-glib.h> #include
ajax中解析json資料的方式
eval(); //此方法不推薦 JSON.parse(); //推薦方法 一、兩種方法的區別 我們先初始化一個json格式的物件: var jsonDate = '{ "name":"周星馳","age":23 }' var
Gson解析json資料
簡介: Json資料是類似xml型別的資料轉化格式但是它的傳輸速率遠遠高於xml的解析速率。 這裡簡單的對用gson解析json格式的資料,為什麼說是簡單的介紹呢,因為博主有更簡單的解析方式後期會進行推出或者掃描頭像進 行私聊(公眾號)。 進行整合: 這裡按照a
Linux下檢視檔案和資料夾佔用記憶體大小、刪除日誌 命令
轉:https://www.cnblogs.com/lixuwu/p/5944062.html 閱讀目錄 1 Linux下檢視檔案和資料夾大小 2 刪除系統日誌等 3 實踐 場景:在sts中執行自動部署時候maven提示No space left on d
後臺返回json資料給前臺和前臺解析json資料
後臺返回json資料和前臺解析json資料 一般來說web開發中,前臺採用json資料提交給後臺,後臺處理資料以後返回json資料給前臺,前臺解析json,顯示資料。 總而言之,前後臺直接交換的資料格式最常用的非json資料無疑了。 這裡就總結一些json資料的前後臺處理方式。
Linux下如何解析ACPI表
說明 本文介紹如何在Linux下檢視ACPI表示。 使用的系統是Ubuntu18.04: Linux home 4.15.0-36-generic #39-Ubuntu SMP Mon Sep 24 16:19:09 UTC 2018 x86_64 x86_64 x86_64 GNU
linux下 mysql清空資料表中的內容sql語句
truncate gk_portal; delete from gk_portal; 這兩者都是將gk_portal表中資料清空,不過也是有區別的,如下: truncate是整體刪除(速度
QT使用QJson生成解析Json資料的方法
QT中使用json還是比較方便的,下面用例子直接說明 舉例子之前首先推薦一個線上解析json格式的網站,具體格式用法如下圖所示: 之後根據這個格式進行json資料解析。 QT使用json需要包含的標頭檔案 #include<qjsondocument.h> #include<qj
android 快速解析json資料搭配Gson庫中Android Studio外掛 GsonFormat
轉:https://www.jianshu.com/p/d34c5e7c8227 更簡潔的文章:http://www.cnblogs.com/foxy/p/7825380.html 如果對json解析資料還不清楚的可以看一下我的例子:ExpandableListView+SQLite+Jso
【我的Android進階之旅】關於解析json資料中自帶轉義符號的正確操作
一、問題描述 在實現一個功能的時候,需要伺服器以json格式返回一段功能配置,比如如下所示的json配置。 1.1 我希望的json格式 { "k": "ClientFilterTrace_android", "isVisible": true
vb6裡解析json資料
vb6裡不支援json物件,這裡使用通過引用js來實現json的解析 獲取簡單的json串裡的值 Dim ScriptObj As Object Dim JsonStr As String JsonSt
java後端解析json資料
寫這篇文章主要是供自己以後翻閱,也給廣大同胞一個參照 前端傳過來的json String str1 = "{'array':[{'id':3,'type':'玩具','organId':4,'num':2}]}"; //key可以是任何引數 SONObject json
安卓開發筆記(九)—— HttpURLConnection請求訪問Web服務,解析JSON資料,多執行緒,CardView佈局技術(bilibili的使用者視訊資訊獲取軟體)
中山大學資料科學與計算機學院本科生實驗報告 (2018年秋季學期) 一、實驗題目 WEB API 第十四周實驗目的 學會使用HttpURLConnection請求訪問Web服務 學習Android執行緒機制,學會執行緒更新UI 學會解析JSO
linux下awk的學習
簡介 awk是一個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。 awk有3個不同版本: awk、nawk和gawk,未作特別說明,一般指
Android 整合okhttp3、listview解析json資料
上上篇文章寫了個Android的模擬介面,終於派上用場了 現在我們將接口裡面的json資料通過ListView顯示出來,效果如下: 先講一下ListView吧, 講ListView之前,肯定要講Adapter,在Android應用程式中,採用資料和顯示分開實現的資料處理方式,由於資料來