나는 다음과 같은 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
답변2
JSON 예:
{"first_name":"Savannah","last_name":"Williams"}
{"first_name":"Aria","last_name":"Acevedo"}
{"first_name":"Emma","last_name":"Puckett"}
{"first_name":"Claire","last_name":"Mathis"}
{"first_name":"Ryder","last_name":"Wong"}
필드별로 정렬:
cat sample.json | jq -s -c 'sort_by(.first_name) | .[]'
내가 여기에서 얻은 것 :