jqを使用してフィールド値でjsonオブジェクトストリームをソートする方法

jqを使用してフィールド値でjsonオブジェクトストリームをソートする方法

私は次のjsonで始まります。

{
  "object": "list",
  "data": [
    {
      "id": "in_1HW85aFGUwFHXzvl8wJbW7V7",
      "object": "invoice",
      "account_country": "US",
      "customer_name": "clientOne",
      "date": 1601244686,
      "livemode": true,
      "metadata": {},
      "paid": true,
      "status": "paid",
      "total": 49500
    },
    {
      "id": "in_1HJlIZFGUwFHXzvlWqhegRkf",
      "object": "invoice",
      "account_country": "US",
      "customer_name": "clientTwo",
      "date": 1598297143,
      "livemode": true,
      "metadata": {},
      "paid": true,
      "status": "paid",
      "total": 51000
    },
    {
      "id": "in_1HJkg5FGUwFHXzvlYp2uC63C",
      "object": "invoice",
      "account_country": "US",
      "customer_name": "clientThree",
      "date": 1598294757,
      "livemode": true,
      "metadata": {},
      "paid": true,
      "status": "paid",
      "total": 57000
    },
    {
      "id": "in_1H8B0pFGUwFHXzvlU6nrOm6I",
      "object": "invoice",
      "account_country": "US",
      "customer_name": "clientThree",
      "date": 1595536051,
      "livemode": true,
      "metadata": {},
      "paid": true,
      "status": "paid",
      "total":  20000
    }
  ],
  "has_more": true,
  "url": "/v1/invoices"
}

もし私がするなら

cat sample.json | jq -C '.data[] | {invoice_id: .id, date: .date | strftime("%Y-%m-%d"), amount: .total} | .amount = "$" + (.amount/100|tostring)'

これを正常に構成できます(実際のデータははるかに冗長であるため、削除するには数百行が必要です)。結果は次のとおりです。

{
  "invoice_id": "in_1HW85aFGUwFHXzvl8wJbW7V7",
  "date": "2020-09-27",
  "amount": "$495"
}
{
  "invoice_id": "in_1HJlIZFGUwFHXzvlWqhegRkf",
  "date": "2020-08-24",
  "amount": "$510"
}
{
  "invoice_id": "in_1HJkg5FGUwFHXzvlYp2uC63C",
  "date": "2020-08-24",
  "amount": "$570"
}
{
  "invoice_id": "in_1H8B0pFGUwFHXzvlU6nrOm6I",
  "date": "2020-07-23",
  "amount": "$200"
}

しかし、これは間違った順序です。最新の項目が最後に最後に表示されるように、日付フィールドでソートしたいと思います。

私は想像できるすべての間違った方法を試しました。どうやって申し込みますかsort_by(.date)cannot index string with string "date"エラー(および他のさまざまなエラーがありますが、主にそのエラー)は引き続き発生します。

ベストアンサー1

~からman jq

sort, sort_by(path_expression) sort 関数は、配列でなければならない入力をソートします。

一般的に言えば、jq使用する必要がある別のコマンドを呼び出す-s--slurp、これらの注文オブジェクトは配列で作成され、キーでソートできます。

... | jq -s 'sort_by(.date)'

これで選択して結果を配列にしたい場合は、すべての項目を括弧で囲むと次のようになります。

jq '[ <some_existing_selection> ] | sort_by(.date)' file.json

はい

始めるjsonの場合は、最初に次のような作業(一連のオブジェクトの作成)を実行するとします。

jq '.data[] | {id: .id, date: .date}' file.json

配列にするには、jq選択全体を括弧で囲む必要があります。

jq '[.data[] | {id: .id, date: .date}]' file.json

これで、この配列を並べ替えることができます。

jq '[.data[] | {id: .id, date: .date}] | sort_by(.date)' file.json

おすすめ記事