SQL 쿼리 출력에서 ​​JSON 생성

SQL 쿼리 출력에서 ​​JSON 생성

다음 데이터베이스 쿼리가 있습니다.

select hostname,size from tableinfo

출력은 다음과 같습니다:

  hostname                   size
------------------------- -----------
  host1                        28
  host2                        13
  host3                        79
  host4                        28
  host5                        17  

또는 다음과 같이 할 수 있습니다.

host1                        28
host2                        13
host3                        79
host4                        28
host5                        17

이 출력을 JSON으로 변환하는 쉘 스크립트를 작성하고 싶지만 어디서 시작해야 할지, 무엇을 해야 할지 잘 모르겠습니다. JSON은 다음과 같아야 합니다.

{
   "data":[
   {  "{#HOSTNAME}":"host1",  "{#SIZE}":"28"  } ,
   {  "{#HOSTNAME}":"host2",  "{#SIZE}":"13"  } ,
   {  "{#HOSTNAME}":"host3",  "{#SIZE}":"79"  } ,
   {  "{#HOSTNAME}":"host4",  "{#SIZE}":"28"  } ,
   {  "{#HOSTNAME}":"host5",  "{#SIZE}":"17"  }
   ]
}

답변1

jq해결책:

 <your sql output> | jq -Rs '{"data": [split("\n") | map(select(length > 0))[] 
                             | split(" +";"g") 
                             | {"{#HOSTNAME}": .[0], "{#SIZE}": .[1]}]}'

산출:

{
  "data": [
    {
      "{#HOSTNAME}": "host1",
      "{#SIZE}": "28"
    },
    {
      "{#HOSTNAME}": "host2",
      "{#SIZE}": "13"
    },
    {
      "{#HOSTNAME}": "host3",
      "{#SIZE}": "79"
    },
    {
      "{#HOSTNAME}": "host4",
      "{#SIZE}": "28"
    },
    {
      "{#HOSTNAME}": "host5",
      "{#SIZE}": "17"
    }
  ]
}

답변2

이것이 SQLite3 데이터베이스라고 가정합니다(다른 데이터베이스 엔진에는 JSON 출력을 생성하는 고유한 기본 방법이 있습니다).

sqlite3 database.db \
    '.mode json' \
    'SELECT hostname AS `{#HOSTNAME}`, size AS `{#SIZE}` FROM tableinfo' |
jq '{ data: . }'

데이터베이스에서 JSON 형식의 데이터를 배열로 가져와 키 아래의 개체 jq에 삽입합니다 . dataSELECT 쿼리는 필요에 따라 호스트 이름과 크기에 사용되는 키 이름을 변경합니다.

그러면 요청한 것과 동일한 JSON 문서가 제공됩니다.

{
  "data": [
    {
      "{#HOSTNAME}": "host1",
      "{#SIZE}": "28"
    },
    {
      "{#HOSTNAME}": "host2",
      "{#SIZE}": "13"
    },
    {
      "{#HOSTNAME}": "host3",
      "{#SIZE}": "79"
    },
    {
      "{#HOSTNAME}": "host4",
      "{#SIZE}": "28"
    },
    {
      "{#HOSTNAME}": "host5",
      "{#SIZE}": "17"
    }
  ]
}

네가 원한다면정밀한언급한 출력 형식을 선택한 후 jq위 파이프라인의 명령을 다음으로 바꿉니다.jtc주문하다:

jtc -T '{"data": {{}} }' -tc

그러면 읽은 데이터가 sqlite3키 값으로 템플릿 에 삽입 data되고 다음과 같은 "세미 컴팩트" 예쁜 인쇄 출력 형식이 생성 -tc됩니다 .jtc

{
   "data": [
      { "{#HOSTNAME}": "host1", "{#SIZE}": "28" },
      { "{#HOSTNAME}": "host2", "{#SIZE}": "13" },
      { "{#HOSTNAME}": "host3", "{#SIZE}": "79" },
      { "{#HOSTNAME}": "host4", "{#SIZE}": "28" },
      { "{#HOSTNAME}": "host5", "{#SIZE}": "17" }
   ]
}

표 형식 데이터(2개의 간단한 열)에서 다음을 사용할 수 있습니다.밀러( mlr)초기 배열을 만들고 동일한 jq또는 명령을 사용하여 해당 키 아래에 jtc모두 삽입합니다 .data

$ mlr --n2j -S label '{#HOSTNAME},{#SIZE}' file | jtc -T '{ "data": {{}} }' -tc
{
   "data": [
      { "{#HOSTNAME}": "host1", "{#SIZE}": "28" },
      { "{#HOSTNAME}": "host2", "{#SIZE}": "13" },
      { "{#HOSTNAME}": "host3", "{#SIZE}": "79" },
      { "{#HOSTNAME}": "host4", "{#SIZE}": "28" },
      { "{#HOSTNAME}": "host5", "{#SIZE}": "17" }
   ]
}

나는 and ("도구 상자 인덱스 형식의 데이터 읽기, JSON 작성")에 대한 약어를 사용 --n2j하고 Miller가 크기 데이터가 (문자열로 처리하는 대신) 정수여야 한다고 추론하는 것을 막기 위해 무언가를 추가했습니다.--inidx--ojson-S

관련 정보