

### 現状

現在、JSONの訂正作業を行っており、既存のJSONから新しいVal要素(Key:Value)を追加する作業を行っています。

**現在のコード**

[code]

    {
      "total": [
          {
            "name": "sasuke",
            "category": "animal",
            "URL": "https://0000/0000/0000"
          },
           {
            "name": "siro",
            "category": "animal",
            "URL": "https://1111/1111/1111"
          },
           {
            "name": "kuro",
            "category": "animal",
            "URL": "https://2222/2222/2222"
          }
       ]
    }
    
[/code]

### 問題点

JSONへ新しいVal要素(Key:Value)を追加する際、Valueに追加を記入したいです。  
要素を追加するには

[code]

    | jq ' .liveInfo[0] |= .+ {"number": 連番}' 
    
[/code]

で実現できることがわかりましたが、連番部分がどの様にコードを書けば良いかがわかりません。  
どなたかご教示をよろしくお願いいたします。

以下実現したいコードになります。

**追加要素**

[code]

    "namber": "連番"
    
[/code]

**完成コード**

[code]

    {
      "total": [
          {
    　　　　"namber": "1"
            "name"："sasuke",
            "category"："animal",
            "URL"："https://0000/0000/0000",
          },
           {
    　　　　"namber": "2"
            "name"："siro",
            "category"："animal",
            "URL"："https://1111/1111/1111",
          },
           {
    　　　　"namber": "3"
            "name"："kuro",
            "category"："animal",
            "URL"："https://2222/2222/2222",
          }
       ]
    
[/code]


CC BY-SA 4.0
2020-09-13T10:54:56.433
70347
2020-09-13T13:04:30.000
2020-09-13T13:04:30.000
37279
question
json shellscript jq
シェルスクリプトのJSON要素で連番を指定したい


テキスト処理と割り切るならawkで加工するのが簡単です。  
`"name":`を含む行を見つけたら、printfで名前がnumberの値として連番を出力します。

[code]

    awk '
    BEGIN{
        no= 1
    }
    /\"name\":/{
        printf("        \"number\": \"%d\",\n", no++)
    }
    {
        print $0
    }
    ' jsonファイル
    
[/code]

【出力結果】

[code]

    {
      "total": [
          {
            "number": "1",
            "name": "sasuke",
            "category": "animal",
            "URL": "https://0000/0000/0000"
          },
           {
            "number": "2",
            "name": "siro",
            "category": "animal",
            "URL": "https://1111/1111/1111"
          },
           {
            "number": "3",
            "name": "kuro",
            "category": "animal",
            "URL": "https://2222/2222/2222"
          }
       ]
    }
    
[/code]


CC BY-SA 4.0
2020-09-13T12:01:44.800
70352
2020-09-13T12:01:44.800
35558
70347
answer


以下は `reduce` を使う方法です。

[code]

    $ jq -r '
        reduce range(.total|length) as $i(.;.total[$i].number="\($i+1)")
      ' data.json
    {
      "total": [
        {
          "name": "sasuke",
          "category": "animal",
          "URL": "https://0000/0000/0000",
          "number": "1"
        },
        {
          "name": "siro",
          "category": "animal",
          "URL": "https://1111/1111/1111",
          "number": "2"
        },
        {
          "name": "kuro",
          "category": "animal",
          "URL": "https://2222/2222/2222",
          "number": "3"
        }
      ]
    }
    
[/code]


CC BY-SA 4.0
2020-09-13T12:34:30.303
70354
2020-09-13T12:34:30.303
70347
answer