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 출력으로 변환합니다.from
jq
$ARGS.positional
file
@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로 변환합니다 .from
date
text
--j2c
Miller는 인용이 필요한 CSV 필드만 인용합니다.