如何用JQ筛选数组中含fanart的首个URL并输出TSV
问题:从JSON提取指定字段生成TSV格式内容
输入JSON数据
{ "MediaContainer": { "Metadata": [ { "Key": "5d77682c151a60001f24bbe8", "Image": [ { "alt": "image", "type": "background", "url": "https://image.tmdb.org/t/p/original/f8Q3Sug5Sa42psw2b3Gdd1aT8t.jpg" }, { "alt": "image", "type": "clearLogoWide", "url": "http://assets.fanart.tv/fanart/movies/2639/hdmovielogo/deconstructing-harry-60f13837ee6aa.png" }, { "alt": "image", "type": "coverArt", "url": "https://metadata-static.imdb.com/4/gracenote/44a1852151a726d730c214b97986c27e.jpg" }, { "alt": "image", "type": "coverPoster", "url": "https://image.tmdb.org/t/p/original/i7Z5DdznqANJUjqWISEFu9bw6J7.jpg" }, { "alt": "image", "type": "coverSquare", "url": "https://metadata-static.imdb.com/c/gracenote/c8c351b348baf43a909e4a3b1c60a443.jpg" }, { "alt": "image", "type": "snapshot", "url": "https://metadata-static.imdb.com/a/gracenote/ab5a905958de8d43c763d74153242690.jpg" } ] } ] } }
需求说明
- 输出TSV格式内容,每行包含两个字段:
- Metadata中的
Key字段值 - 对应Image数组中第一个url包含"fanart"字符串的地址
- Metadata中的
预期输出
5d77682c151a60001f24bbe8 http://assets.fanart.tv/fanart/movies/2639/hdmovielogo/deconstructing-harry-60f13837ee6aa.png
错误尝试代码
jq -r '.MediaContainer.Metadata[] | [.ratingKey,.Image[] | select( .url as $items | "fanart" | IN($items[]) )] | @tsv' 'trending.json'
问题分析与解决方法
错误点:
- 字段名错误:JSON中目标字段是
Key,代码里误写为.ratingKey - 筛选逻辑错误:
IN($items[])的用法不符合需求,应该用contains("fanart")直接检查url是否包含指定字符串 - 未处理"取第一个匹配项"的需求:原代码没有限制只输出第一个符合条件的url
正确命令:
jq -r '.MediaContainer.Metadata[] | [.Key, first(.Image[] | select(.url | contains("fanart")) | .url)] | @tsv' trending.json
命令解释:
.MediaContainer.Metadata[]:遍历所有Metadata条目.Key:提取当前条目的Key值first(.Image[] | select(.url | contains("fanart")) | .url):- 遍历当前条目的Image数组
- 筛选出url包含"fanart"的项
- 提取这些项的url并取第一个结果
[...]:将Key和筛选后的url组合成数组@tsv:将数组转换为TSV格式输出
内容的提问来源于stack exchange,提问作者Mike Davis
相关产品推荐
相关产品推荐

