JSON 데이터에서 jq를 사용하여 정수를 달러 금액으로 변환하는 방법은 무엇입니까?

JSON 데이터에서 jq를 사용하여 정수를 달러 금액으로 변환하는 방법은 무엇입니까?

이런 데이터가 있어요

{
  "dateCreated": "2020-06-12",
  "status": "pending",
  "depositDate": "2020-06-15",
  "amount": 41237
}
{
  "dateCreated": "2020-06-05",
  "status": "paid",
  "depositDate": "2020-06-08",
  "amount": 37839
}
{
  "dateCreated": "2020-04-02",
  "status": "paid",
  "depositDate": "2020-04-03",
  "amount": 67
}

형식은 jq다음과 같습니다.

 request-some-api | jq '.data[] | {dateCreated: .created | strftime("%Y-%m-%d"), status: .status, depositDate: .arrival_date | strftime("%Y-%m-%d"), amount: .amount,}'

.amount소수점 이하 자릿수를 사용하여 센트가 아닌 달러 금액으로 값을 표시하도록 수정하고 싶습니다 ...

{
  "dateCreated": "2020-06-12",
  "status": "pending",
  "depositDate": "2020-06-15",
  "amount": $412.37
}
{
  "dateCreated": "2020-06-05",
  "status": "paid",
  "depositDate": "2020-06-08",
  "amount": $378.39
}
{
  "dateCreated": "2020-04-02",
  "status": "paid",
  "depositDate": "2020-04-03",
  "amount": $.67
}

...하지만 이에 대한 문서를 찾지 못했나요? jq이런 변환이 가능한가요 ? 기호가 없더라도 달러와 센트 사이에 숫자 $만 추가하면 .도움이 됩니다.

답변1

이와 같이:

jq '.amount = "$" + (.amount/100|tostring)' file.json

산출

{
  "dateCreated": "2020-06-12",
  "status": "pending",
  "depositDate": "2020-06-15",
  "amount": "$412.37"
}
{
  "dateCreated": "2020-06-05",
  "status": "paid",
  "depositDate": "2020-06-08",
  "amount": "$378.39"
}
{
  "dateCreated": "2020-04-02",
  "status": "paid",
  "depositDate": "2020-04-03",
  "amount": "$0.67"
}

답변2

원하는 출력 형식이 잘못된 것 같습니다. "amount"를 문자열 값으로 사용하고 싶습니다.

처음에 $를 추가한 다음 금액을 100으로 나누고 문자열로 변환하면 됩니다.

예를 들어

jq '.amount = "$" + (.amount/100|tostring)'

amount테스트 파일에서 이 작업을 수행하면 3 줄이 다음과 같이 변환된 것을 볼 수 있습니다 .

"amount": "$412.37"
"amount": "$378.39"
"amount": "$0.67"

그러나 여기에는 몇 가지 이상한 상황이 있으며 이는 중요할 수도 있고 중요하지 않을 수도 있습니다. 금액이 0으로 끝나면(예: 41230) '$412.3'으로 표시됩니다. 마찬가지로 정수(41200)이면 "$412"가 표시됩니다.

jq이러한 문제를 쉽게 처리할 수 있는 방법이 있는지 확신할 수 없으므로 몇 가지 테스트를 추가했습니다.

jq '.amount = "$" + (.amount/100|tostring) + (if .amount%100 == 0 then ".0" else "" end ) + (if .amount%10 ==0 then "0" else "" end)'

더 효율적인 방법이 있을 수 있습니다.

답변3

$ jq '.amount |= "$" + (./100 | tostring | ltrimstr("0"))' file
{
  "dateCreated": "2020-06-12",
  "status": "pending",
  "depositDate": "2020-06-15",
  "amount": "$412.37"
}
{
  "dateCreated": "2020-06-05",
  "status": "paid",
  "depositDate": "2020-06-08",
  "amount": "$378.39"
}
{
  "dateCreated": "2020-04-02",
  "status": "paid",
  "depositDate": "2020-04-03",
  "amount": "$.67"
}

이는 amount키 값을 100으로 나눈 후 문자열로 변환합니다. 그런 다음 문자열 앞에 a를 추가하기 $전에 선행 0(있는 경우)을 잘라냅니다 .

관련 정보