如何在[和]内部过滤零件?

时间:2017-03-05 02:10:34

标签: json linux bash shell jq

我试图过滤我从黑暗的天空api得到的.json文件。 我很难用多个apis做同样的事情输出.json文件(spotify,reddit,lastfm和dark sky)。 这是来自http://pastebin.com/rxqHBumk的整个.json文件。 我可以使用以下命令过滤该文件:jq'.daily.data',直到该状态:http://pastebin.com/Mukz14rJ但我不能过滤它。

因为我坚持这一点,所以我会帮助你。

3 个答案:

答案 0 :(得分:0)

  

如何在[和]之后过滤部件?

基本上有两种方式:

  1. 如果要保留数组,请输入:map(select(...))

  2. 否则,输入。[] |选择(...)

答案 1 :(得分:0)

jq可以解决这个问题。

要使用.summary仅从.daily.data的每个元素中提取[]值,请使用

.daily.data[].summary

在指定的pastebin上运行此值会返回

"Leichter Regen am Vormittag und Nacht."
"Leichter Regen am Vormittag."
"Den ganzen Tag lang überwiegend bewölkt."
"Leichter Regen von nachmittags bis abends."
"Den ganzen Tag lang stark bewölkt."
"Abends Nieselregen."
"Den ganzen Tag lang Regen."
"Leichter Regen am Vormittag und Abend."

要获取每个元素.daily.data替换为仅包含摘要的对象的版本,请使用过滤器

 .daily.data[] |= {summary}

在指定的pastebin上运行此值会返回

{
  "latitude": 53,
  "longitude": 9,
  "timezone": "Europe/Berlin",
  "offset": 1,
  "daily": {
    "summary": "Die ganze Woche leichter Regen mit einem Temperaturminimum von 7°C am Mittwoch.",
    "icon": "rain",
    "data": [
      {
        "summary": "Leichter Regen am Vormittag und Nacht."
      },
      {
        "summary": "Leichter Regen am Vormittag."
      },
      {
        "summary": "Den ganzen Tag lang überwiegend bewölkt."
      },
      {
        "summary": "Leichter Regen von nachmittags bis abends."
      },
      {
        "summary": "Den ganzen Tag lang stark bewölkt."
      },
      {
        "summary": "Abends Nieselregen."
      },
      {
        "summary": "Den ganzen Tag lang Regen."
      },
      {
        "summary": "Leichter Regen am Vormittag und Abend."
      }
    ]
  }
}

如果需要其他东西,可以通过调整来实现。

答案 2 :(得分:-1)

我99%确定我理解正确,所以这里有:我理解你想在第二个粘贴中采用说“摘要”的行并提取值。我不知道json,我假设您的jq命令很好地格式化json数据,填充换行符等等。假设一行上只有一个summary,汇总值永远不会包含带引号的双引号,并且该值永远不会超过换行符,您可以使用以下内容完成您想要的操作:

egrep '^ *"summary":' json.txt | while IFS= read line; do expr match "$line" ' *"summary": "\(.*\)".*'; done

这说明(while)在文件json.txt中包含summary字段的所有行(^)除外无限空格(*)(egrep '^ *"summary":' json.txt |),将它们(read)读入变量line而不会丢失空格(IFS=),然后提取(expr match) {1}})来自该行("$line")第二个引用字符串(' *"summary": "\(.*\)".*')的内容,其中\(\)隔离了您要打印的内容(如果要将它们包含在输出中,请在这些分隔符内移动引号。 .*表示任意(零个或多个)字符的字符串。 |表示获取左命令的输出并将其提供给右命令的输入。

这很简单。我假设有json工具可以做你想做的事,但我不知道它们是什么。它们可能比这更复杂但是如果你要做很多json处理,你可能有必要找到它们并学习它们。