玩了一下 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
-vOFS="|"
指定輸出拼接符號爲 | ;1
開始的,這點跟常規的編程規範不同;gsub
全局替換,須要去掉 "
和 }
,它們都是處理邏輯關鍵字, 必須進行轉義;print
是直接輸出 awk 的結果。