我应该如何使用 jq 命令将 JSON 文件中的值替换为其 md5 值?

我应该如何使用 jq 命令将 JSON 文件中的值替换为其 md5 值?

我有一个大日志文件,其中包含一行,如下例所示:

{"data_1":210,"target_number":1096748811,"extra_data":66}
{"data_1":0,"target_number":7130881445,"extra_data":56}
{"data_1":1712,"target_number":1098334917,"extra_data":48}
{"data_1":0,"target_number":3062674667,"extra_data":54}
{"data_1":53,"target_number":5110609228,"extra_data":246}

我想更换目标编号的价值与md5价值评估整个文件

我正在尝试使用jq以下基本语法的命令:

jq  '.target_number|= "md5(\(.))"' input2.log

预期产出是 :

{"data_1":210,"target_number":620e25e6f054992308c564cb883e4940,"extra_data":66}

电流输出是 :

{"data_1":210,"target_number":md5(1096748811),"extra_data":66}

答案1

jq没有md5像base64那样的直接计算功能。为此,您需要使用 shell 的实用程序。

jq -c . input.log |
while IFS= read -r obj; do 
    md5sum=$( printf '%s' "$obj" | jq -j '.target_number' | md5sum | cut -d' ' -f1)
    jq -c --arg md5 "$md5sum" '.target_number = $md5' <<<"$obj"
done > output.json

请注意,生成的哈希md5sum不能解释为 中的数字jq,而只能解释为字符串值。因此它将用引号引起来。

请注意,这种方法“预计”会更慢,因为它涉及jq分别调用输入文件的每一行并计算该数字的哈希值。

答案2

我用 python 创建了一个受 jq 启发的工具,它可以访问所有 python 函数。

$ pip install jf

将您的数据放在 test.jsonl 中

$ jf -c --import hashlib '{data_1: .data_1, target_number: hashlib.md5(str(.target_number).encode()).hexdigest(), extra_data: .extra_data}' test.jsonl
{"data_1": 210, "target_number": "620e25e6f054992308c564cb883e4940", "extra_data": 66}
{"data_1": 0, "target_number": "f83d74be3dcb71d53263aefdf08203a9", "extra_data": 56}
{"data_1": 1712, "target_number": "56ae797ad2c16813d1a6168d28b58d89", "extra_data": 48}
{"data_1": 0, "target_number": "81394a193503036fad53b8a9d6ca2456", "extra_data": 54}
{"data_1": 53, "target_number": "6f01490a5dc694e51a69b79f7dd21c24", "extra_data": 246}

编辑:或者更简单

$ jf -c --import hashlib 'update({target_number: hashlib.md5(str(.target_number).encode()).hexdigest()})' test.json
{"data_1": 210, "target_number": "620e25e6f054992308c564cb883e4940", "extra_data": 66}
{"data_1": 0, "target_number": "f83d74be3dcb71d53263aefdf08203a9", "extra_data": 56}
{"data_1": 1712, "target_number": "56ae797ad2c16813d1a6168d28b58d89", "extra_data": 48}
{"data_1": 0, "target_number": "81394a193503036fad53b8a9d6ca2456", "extra_data": 54}
{"data_1": 53, "target_number": "6f01490a5dc694e51a69b79f7dd21c24", "extra_data": 246}

相关内容