私は次の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