我们有以下换行符分隔的 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"}
假设我们知道/有一个需要从字符串转换为整数 [team, leagueId] 的列的列表/数组,我们如何进行此转换?这是否可以通过(a)使用诸如 之类的工具的 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
值(如果存在且非空)。
概括为将一组键转换为数字(如果存在):
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
这里发生的情况是,该语句.[$key] // empty
用于一组$key
字符串,从对象生成值,其中$key
是具有非空值的现有键。然后这些值被转换为数字。字符串$key
是从命令行传入的数组中获取的。