jq를 사용하여 json을 csv로 변환해 보세요.

jq를 사용하여 json을 csv로 변환해 보세요.

jq를 사용하여 데이터를 csv로 변환하는 방법을 알 수 없는 것 같습니다. 나는 다음과 같은 JSON을 가지고 있습니다 :

    {
  "id": 2,
  "type": "message",
  "date": "2010-01-11T01:19:45",
  "edited": "1969-12-31T19:00:00",
  "from": "USER1",
  "from_id": 5514,
  "text": "Message1"
 },
 {
  "id": 3,
  "type": "message",
  "date": "2010-01-11T01:19:28",
  "edited": "1969-12-31T19:00:00",
  "from": "USER2",
  "from_id": 5515,
  "text": "Message2"
 },
 {
  "id": 4,
  "type": "message",
  "date": "2010-01-11T01:19:28",
  "edited": "1969-12-31T19:00:00",
  "from": "USER1",
  "from_id": 5514,
  "text": "Message3"
 },

json에서 날짜, 소스 및 텍스트를 가져와서 다음과 같이 csv로 출력하려고 합니다.

From,Date,Text
USER1,2010-01-11T01:19:45,Message1
USER2,2010-01-11T01:19:28,Message2
USER1,2010-01-11T01:19:28,Message3

jq로 이 작업을 수행할 수 있는 방법이 있습니까? 아니면 다른 것을 사용하는 것이 더 나을까요?

답변1

그것은

<input.json jq --raw-output '.[]|[.from,.date,.text]|@csv'

답변2

추출할 키를 동적으로 선택하고 출력 문서의 CSV 헤더에서 해당 키를 사용하려는 경우 다음과 같이 명령줄에 전달할 수 있습니다 jq.

jq -r '$ARGS.positional, map([.[$ARGS.positional[]]])[] | @csv' file --args date from

이는 and 표현식으로 전달됩니다 date. 표현식에서 이러한 문자열은 배열에서 발견됩니다. 표현식은 먼저 이 배열을 사용하여 제목 태그(키 자체) 배열을 만듭니다. 그런 다음 배열 요소를 키로 사용하여 입력 데이터에서 해당 값을 추출합니다. 그런 다음 연산자를 사용하여 헤더와 데이터를 올바르게 인용된 CSV 출력으로 변환합니다.fromjq$ARGS.positionalfile@csv

질문의 데이터가 주어지면 위 명령은 다음과 같은 출력을 생성합니다(JSON 조각이 배열에 배치되고 마지막 쉼표가 제거된다고 가정).

"date","from"
"2010-01-11T01:19:45","USER1"
"2010-01-11T01:19:28","USER2"
"2010-01-11T01:19:28","USER1"

--args from date text대신 사용하면 --args date from얻을 수 있습니다.

"from","date","text"
"USER1","2010-01-11T01:19:45","Message1"
"USER2","2010-01-11T01:19:28","Message2"
"USER1","2010-01-11T01:19:28","Message3"

jq모든 CSV 출력 필드는 항상 인용됩니다.


다음을 사용하여 동일한 유형의 출력을 쉽게 얻을 수도 있습니다.밀러( mlr):

$ mlr --j2c cut -f from,date,text file
date,from,text
2010-01-11T01:19:45,USER1,Message1
2010-01-11T01:19:28,USER2,Message2
2010-01-11T01:19:28,USER1,Message3

여기서는 , 및 mlr이라는 필드를 잘라내(추출) 도록 요청합니다 . 단일 옵션을 사용하여 입력을 JSON에서 CSV로 변환합니다 .fromdatetext--j2c

Miller는 인용이 필요한 CSV 필드만 인용합니다.

관련 정보