다음과 같이 개행으로 구분된 JSON이 있습니다.
{"leagueId": "1", "name": "the ballers"}
{"team": "2", "leagueId": "1", "name": "the hoopers"}
{"team": "3", "leagueId": "1", "name": "the gamerrs"}
{"team": "4", "leagueId": "1", "name": "the drivers"}
{"team": "5", "leagueId": "1", "name": "the jumpers"}
{"team": "6", "leagueId": "1", "name": "the riserss"}
팀, 리그 ID둘 다 정수여야 하며 이 NDJSON을 수정하여 이러한 문자열을 정수로 변환하려고 합니다. 우리가 원하는 결과는 다음과 같습니다:
{"leagueId": 1, "name": "the ballers"}
{"team": 2, "leagueId": 1, "name": "the hoopers"}
{"team": 3, "leagueId": 1, "name": "the gamerrs"}
{"team": 4, "leagueId": 1, "name": "the drivers"}
{"team": 5, "leagueId": 1, "name": "the jumpers"}
{"team": 6, "leagueId": 1, "name": "the riserss"}
문자열에서 정수 [팀, 리그 ID]로 변환해야 하는 열의 목록/배열을 알고 있다고 가정하면 이 변환을 어떻게 수행합니까? (a) this 와 같은 도구를 사용하는 bash 명령을 통해 가능합니까 jq
, 아니면 (b) Python 솔루션이 있습니까? 전체 NDJSON의 크기는 약 10GB이며 이는 일일 데이터 수집 파이프라인의 한 단계이므로 성능이 매우 중요합니다.
편집하다: jq -c '{leagueId: .leagueId | tonumber, team: .team | tonumber, name: .name}' tmp/testNDJSON.json > tmp/new_output.json
다음과 같습니다이것은첫 번째 JSON에서 누락된 값이 아니었다면 작동할 것입니다 team
. 도움을 주셔서 감사합니다!
답변1
jq -c '.leagueId |= tonumber | (.team // empty) |= tonumber' file
이는 leagueId
그 안의 각 객체를 숫자로 변환한 다음 team
존재하고 null이 아닌 경우 값을 변환합니다.
키 세트가 있는 경우 숫자로 변환하도록 일반화되었습니다.
jq -c --argjson keys '["team", "leagueId"]' \
'($keys[] as $key | .[$key] // empty) |= tonumber' file
사용jo
다음 목록을 만듭니다.
jq -c --argjson keys "$(jo -a team leagueId)" \
'($keys[] as $key | .[$key] // empty) |= tonumber' file
여기서 일어나는 일은 null이 아닌 값을 가진 기존 키가 있는 개체에서 값을 생성하기 위해 문자열 .[$key] // empty
집합에 대해 명령문이 사용된다는 것입니다. 그런 다음 이 값은 숫자로 변환됩니다. 문자열은 명령줄에서 전달된 배열에서 가져옵니다.$key
$key
$key