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

답변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) | .[]'

내가 여기에서 얻은 것 :

소스 웹사이트

관련 정보