我正在尝试从此 JSON 文件中提取特定列(该文件可能格式不正确)。
这是一个数据样本:
{ "_id" : { "$oid" : "4ddb1e4a9a0881572c000008" }, "aggregates" : { "_id" : { "$oid" : "4e0cc19ccd62f55ff9000006" }, "comments" : 0, "followers" : 1610, "following" : 92, "likes" : 8, "mig" : 1, "ntf" : 294, "posts" : 1, "yaf" : 1 }, "created_at" : { "$date" : 1306205770619 }, "devices" : [ "ios2:b54e0199cbcf73ba602bd11365b8bd3a7024796b", "ios2:7511337bea3c2378533fedceb156fae0a4a12bfe" ], "email" : "[email protected]", "email_verified" : true, "fb_info" : { "ext_user_id" : "123", "ext_access_token" : "tok_id", "ext_token_expr" : { "$date" : 1448577425000 }, "ext_username" : null, "fetched_at" : { "$date" : 1306205770610 }, "ext_permissions" : { "email" : 1, "offline_access" : 1, "contact_email" : 1, "user_friends" : 1, "publish_actions" : 1, "public_profile" : 1 }, "_id" : { "$oid" : "null" }, "ext_token_secret" : null }, "fb_user_id" : "123", "first_name" : "null", "gender" : "male", "last_name" : "null", "last_viewed_notification" : { "$oid" : "51525c4b4b807539ab002de4" }, "lns" : 1258, "profile" : { "city" : "San Francisco", "state" : "California", "_id" : { "$oid" : "4e6a9536cd62f5543b00000b" } }, "pv2" : { "desc" : "San Francisco, California" }, "reg_method" : "fb", "seg" : { "sup" : "I" }, "status" : "active", "username" : "null" }
有多个这样的列,没有任何 [] 3 行,格式相同,以 { 开头,以 } 结尾
所以我在这个例子中使用了jq
在每个字段数据之间添加逗号。我的命令是:
cat example.json example.json example.json |
jq -r '.status,.city,.gender' | paste -sd,
(样本数据被打印三次以重现我使用真实数据得到的结果)。
输出是:
active,null,male,active,null,male,active,null,male
每次提取数据后应该有一个新行,我现在不知道每次如何执行此操作。我尝试提取它们,我在一行中获取了所有数据。正确的输出应该是每个数据的新行。
active,null,male
active,null,male
active,null,male
答案1
您可以使用字符串插值的特点jq
.您可以输出一个字符串,其中占位符\()
可以包含选定的值,其余部分是周围的文本,所有这些都在双引号内。对于你的例子:
jq -r '"\(.status),\(.city),\(.gender)"' example.json{,,}
active,null,male
active,null,male
active,null,male
答案2
$ cat file file file | mlr --j2c -N unsparsify --fill-with null -f status,city,gender then cut -o -f status,city,gender
active,null,male
active,null,male
active,null,male
这里使用 Miller( mlr
) 连续读取问题中的 JSON 3 次。每次它都会首先使用操作填充字段status
、city
、 或gender
字符串中的任何空值或缺失值。然后它用于提取这些相同的字段。输出将是一个无标头的 CSV 文件,任何需要引用的字段都将被引用。null
unsparsify
cut