我使用curl来获取JSON文件。我的问题是,我想在一行中获得一组4个单词,然后换行,并按第一列排序。
我在试着:
curl -L 'http://mylink/ | jq '.[]| .location, .host_name, .serial_number, .model'我得到了
"Office-1"
"work-1"
"11xxx111"
"hp"
"Office-2"
"work-2"
"33xxx333"
"lenovo"
"Office-1"
"work-3"
"22xxx222"
"dell"我想要:
"Office-1", "work-1", "11xxx111", "hp"
"Office-1" "work-3", "22xxx222", "dell"
"Office-2", "work-2", "33xxx333", "lenovo"我尝试了jq -S ".[]| .location| group_by(.location),以及其他一些像sort_by(.location)这样的组合,但都不起作用。我收到错误:jq: error (at <stdin>:1): Cannot iterate over string ("Office-1")
我的JSON文件示例:
[
{
"location": "Office-1",
"host_name": "work-1",
"serial_number": "11xxx111",
"model": "hp"
},
{
"location": "Office-2",
"host_name": "work-2",
"serial_number": "33xxx333",
"model": "lenovo"
},
{
"location": "Office-1",
"host_name": "work-3",
"serial_number": "22xxx222",
"model": "dell"
}
]发布于 2021-05-20 05:05:34
要仅按.location排序,而不使用外部排序:
map( [ .location, .host_name, .serial_number, .model] )
| sort_by(.[0])[]
| map("\"\(.)\"") | join(", ")", "符合规定的要求。
如果您希望输出为CSV,只需将上面的jq程序中的最后一行替换为@csv。
如果目标是最大限度地减少击键次数,那么如果您确定键始终按所需的顺序排列,则可以将第一行替换为map( [ .[] ] )
发布于 2021-05-20 04:17:32
您可以要求jq生成任意格式的字符串。
curl -L 'http://mylink/ |
jq -r '.[]| "\"\(.location)\", \"\(.host_name)\", \"\(.serial_number)\", \"\(.model)\""' |
sort在双引号内,\"生成文字双引号,\(.field)插入字段名。-r选项是生成非JSON输出所必需的。
发布于 2021-05-20 04:31:59
这将得到您想要的输出:
jq -r 'group_by(.location) | .[] | .[] | map(values) | "\"" + join ("\", \"") + "\""'如下所示:
$ jq -r 'group_by(.location) | .[] | .[] | map(values) | "\"" + join ("\", \"") + "\""' /tmp/so7713.json
"Office-1", "work-1", "11xxx111", "hp"
"Office-1", "work-3", "22xxx222", "dell"
"Office-2", "work-2", "33xxx333", "lenovo"如果您希望所有内容都作为一个字符串,那么就简单一点:
$ jq 'group_by(.location) | .[] | .[] | map(values) | join (", ")' /tmp/so7713.json
"Office-1, work-1, 11xxx111, hp"
"Office-1, work-3, 22xxx222, dell"
"Office-2, work-2, 33xxx333, lenovo"请注意,第二个示例中缺少-r。
我觉得一定有更好的方法来做.[] | .[],但我还不知道它是什么。
https://stackoverflow.com/questions/67607713
复制相似问题