задний план
Играл с процессом обработки базы данных awk, извлекал и анализировал данные в формате json из столбца в данных, добавлял их к соответствующему фрагменту данных и разделял вывод с помощью |. Формат необработанных данных:
335970 | 115 | {"key1":value,"key2":value}
вывод:
335970 | 115 |0421000841sgm6p|-13075235|703,160|0|703,160
Анализ реализации
Сначала определите файл данных data.log со следующим содержимым:
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
Выполнение заказа:
Анализ процесса
Awk не очень, то есть процесс обработки нельзя форматировать, в результате получаются длинные команды, которые не удобно читать.Вот разборка процесса анализа и обработки:
{
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:
Программирование Апокалипсиса
Возможность писать длинную логику обработки в команде awk действительно мощная.Вот несколько моментов, на которые следует обратить внимание:
-
-vOFS="|"
Укажите выходной символ соединения как | ; - Индекс массива в логике обработки взят из
1
Во-первых, это не то же самое, что обычные нормы программирования; - При объединении значений JSON первое значение не нуждается в коннекторе |, потому что сам awk содержит коннектор;
- Чтобы удалить ненужные символы из конечного результата, используйте
gsub
Глобальная замена, нужно удалить"
и}
, все они обрабатывают ключевые слова логики и должны бытьпобег; - последнее предложение
print
является прямым выходом awk.