Linux 學習:用 awk 命令提取 JSON 數據的值列

背景

玩了一下 awk 的數據庫處理過程,將數據中的某一列 json 格式的數據提取解析出來,並追加在對應的那條數據後面,用 | 分割輸出。原始數據格式爲:數據庫

335970 | 115 | {"key1":value,"key2":value}
複製代碼

輸出:編程

335970 | 115 |0421000841sgm6p|-13075235|703,160|0|703,160
複製代碼

實現分析

首先,定義一個數據文件 data.log,文件內容以下:json

335970 | 115 | {"traceid":"0421000841sgm6p","pixeldata":-13075235,"pixelcoordinate":"703,160","pixelabnormaldata":0,"collectedpixeldata":"703,160"} 
335971 | 116 | {"traceid":"0421000666sgm6p","pixeldata":-12325235,"pixelcoordinate":"733,144","pixelabnormaldata":1,"collectedpixeldata":"333,132 複製代碼

編寫處理命令,用 | 分割,並用 | 拼接後輸出,這裏着重要對第三列的數據再處理,awk 真神奇,能夠寫很長的邏輯來處理。數組

awk -F "|"  -vOFS="|"  '{l=split($3,arr,",\"");$3="";for(i=1;i<=l;i++){ll=split(arr[i],arr2,":"); if(i!=1)$3=$3"|";$3=$3arr2[2]} ;gsub(/\"/,"",$3);gsub(/\}/,"",$3);print }' ./data.log
複製代碼

執行命令: bash

在這裏插入圖片描述

處理過程分析

awk 不太好的一點,就是不能對處理過程進行格式化,致使命令很長不太好讀,這裏拆解分析處理過程:ui

{
l=split($3,arr,",\"");    // 對第三列用 ," 分割,獲得 JSON 的 key-value $3=""; // 初始化第三列 for(i=1;i<=l;i++){ // 遍歷第三列的分割的 JSON 屬性對 ll=split(arr[i],arr2,":"); // 再對每個 key-value 用: 分割 if(i!=1)$3=$3"|"; // 非第一個 key-value 的時候,須要鏈接符號 | $3=$3arr2[2]} ; // 拼接新的第三例,只取JSON 的 值列,下標是 2 gsub(/\"/,"",$3); // 替換值的 "
   gsub(/\}/,"",$3); // 替換掉右側的 }
   print 
}
複製代碼

這裏,若是沒有 gsub 替換邏輯,輸出的信息帶着 JSON 的引號和括號: spa

在這裏插入圖片描述

編程啓示錄

awk 命令中能寫很長的處理邏輯,真是太強大了,這裏有幾個注意點:3d

  1. -vOFS="|" 指定輸出拼接符號爲 | ;
  2. 處理邏輯中的數組下標是從 1 開始的,這點跟常規的編程規範不同;
  3. 拼接 JSON 值的時候,第一個值不須要 | 鏈接符,由於 awk 本身帶着鏈接符了;
  4. 對最終結果剔除無用字符,用 gsub 全局替換,須要去掉 "} ,它們都是處理邏輯關鍵字, 必須進行轉義
  5. 最後一句的 print 是直接輸出 awk 的結果。
相關文章
相關標籤/搜索