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

jqmd5Base64와 같은 직접 계산 기능 은 없습니다 . 이렇게 하려면 쉘의 유틸리티를 사용해야 합니다.

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 기능에 액세스할 수 있는 Python에서 jq 영감을 받은 도구를 만들었습니다.

$ 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}

관련 정보