1. 程式人生 > >Linux下如何使用awk解析json資料

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

linuxawk日誌分析

linux 接口 記錄 video 文本命令數據分析假設線上倒出的接口訪問日誌有上百行,該日誌的記錄格式如下:/data1/www/logs/archives/170524/170524.v6.weibo.com_10.72.13.113.0.cn.gz:v6.weibo.com 123.12

linuxawk內置函數的使用(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

linuxawk的學習

簡介 awk是一個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。 awk有3個不同版本: awk、nawk和gawk,未作特別說明,一般指

Android 整合okhttp3、listview解析json資料

上上篇文章寫了個Android的模擬介面,終於派上用場了 現在我們將接口裡面的json資料通過ListView顯示出來,效果如下: 先講一下ListView吧, 講ListView之前,肯定要講Adapter,在Android應用程式中,採用資料和顯示分開實現的資料處理方式,由於資料來