我有一个大日志文件,其中包含一行,如下例所示:
{"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}