JQ는 쉼표 없이 json 행을 반환합니다.

JQ는 쉼표 없이 json 행을 반환합니다.

명확하게 말하자면, 여기에 있는 다른 정적 JSON 파일에 기록될 의사 JSON 출력을 원합니다. 따라서 배열이나 다른 항목에 포함되지 않고 출력의 각 엔터티만 나중에 누락된 쉼표를 가져오면 됩니다.

현재 내 쿼리는 다음과 같습니다.

.[] | select(.auditId == "categories") |
{
  "type": "section",
  "text": {
    "type": "mrkdwn",
    "text": "*\(.auditProperty):* \(.actual) (expected \(.expected))"
  }
}

어떤 출력:

{
  "type": "section",
  "text": {
    "type": "mrkdwn",
    "text": "*performance:* 1 (expected 0.8)"
  }
}
{
  "type": "section",
  "text": {
    "type": "mrkdwn",
    "text": "*accessibility:* 1 (expected 0.9)"
  }
}
{
  "type": "section",
  "text": {
    "type": "mrkdwn",
    "text": "*best-practices:* 0.96 (expected 0.9)"
  }
}
{
  "type": "section",
  "text": {
    "type": "mrkdwn",
    "text": "*seo:* 0.64 (expected 0.5)"
  }
}

내가 정말로 하고 싶을 때:

{
  "type": "section",
  "text": {
    "type": "mrkdwn",
    "text": "*performance:* 1 (expected 0.8)"
  }
},
{
  "type": "section",
  "text": {
    "type": "mrkdwn",
    "text": "*accessibility:* 1 (expected 0.9)"
  }
},
{
  "type": "section",
  "text": {
    "type": "mrkdwn",
    "text": "*best-practices:* 0.96 (expected 0.9)"
  }
},
{
  "type": "section",
  "text": {
    "type": "mrkdwn",
    "text": "*seo:* 0.64 (expected 0.5)"
  }
},

각 항목 뒤에 쉼표를 적어주세요! 이것은 나를 미치게 만들고 있습니다. 다른 위치에 를 추가하려고 시도했지만 join(", ")최종 출력에 아무 영향도 미치지 않거나 어디에 넣었는지에 따라 컴파일되지 않습니다.

이것은 데이터를 포함하는 jqplay입니다.https://jqplay.org/s/xx3F_IWn03g


원시 입력 JSON:

[
  {
    "name": "minScore",
    "expected": 0.8,
    "actual": 1,
    "values": [
      1,
      1,
      1
    ],
    "operator": ">=",
    "passed": true,
    "auditProperty": "performance",
    "auditId": "categories",
    "level": "error",
    "url": "http://localhost:8080/page2"
  },
  {
    "name": "minScore",
    "expected": 0.9,
    "actual": 1,
    "values": [
      1,
      1,
      1
    ],
    "operator": ">=",
    "passed": true,
    "auditProperty": "accessibility",
    "auditId": "categories",
    "level": "error",
    "url": "http://localhost:8080/page2"
  },
  {
    "name": "minScore",
    "expected": 0.9,
    "actual": 0.96,
    "values": [
      0.93,
      0.96,
      0.96
    ],
    "operator": ">=",
    "passed": true,
    "auditProperty": "best-practices",
    "auditId": "categories",
    "level": "error",
    "url": "http://localhost:8080/page2"
  },
  {
    "name": "minScore",
    "expected": 0.5,
    "actual": 0.64,
    "values": [
      0.64,
      0.64,
      0.64
    ],
    "operator": ">=",
    "passed": true,
    "auditProperty": "seo",
    "auditId": "categories",
    "level": "error",
    "url": "http://localhost:8080/page2"
  }
]

답변1

당신은 원하는 것 같다조정auditIdstring 으로 설정된 항목입니다 categories. 당신이 하고 있는 일은정제최상위 배열의 이러한 요소를 수정합니다. 이는 배열이 아닌 객체 세트를 제공합니다.

|배열에서 요소를 추출하는 데 사용하는 대신 다음을 사용하십시오.|=해당 요소를 수정합니다. 결과 배열을 다른 파일의 JSON 구조에 올바르게 삽입하는 방법은 이 답변의 끝을 참조하세요.

그래서, 사용

.[] |= (
    select(.auditId == "categories") |
    {
        "type": "section",
        "text": {
            "type": "mrkdwn",
            "text": "*\(.auditProperty):* \(.actual) (expected \(.expected))"
        }
    }
)

아니면 전혀 사용하지 말고 .[]사용하세요.map()최상위 배열의 각 요소에 대한 표현식:

map(
    select(.auditId == "categories") |
    {
        "type": "section",
        "text": {
            "type": "mrkdwn",
            "text": "*\(.auditProperty):* \(.actual) (expected \(.expected))"
        }
    }
)

이러한 표현식은 다음과 같은 요소 배열을 제공합니다.

[
  {
    "type": "section",
    "text": {
      "type": "mrkdwn",
      "text": "*performance:* 1 (expected 0.8)"
    }
  },
  {
    "type": "section",
    "text": {
      "type": "mrkdwn",
      "text": "*accessibility:* 1 (expected 0.9)"
    }
  },
  {
    "type": "section",
    "text": {
      "type": "mrkdwn",
      "text": "*best-practices:* 0.96 (expected 0.9)"
    }
  },
  {
    "type": "section",
    "text": {
      "type": "mrkdwn",
      "text": "*seo:* 0.64 (expected 0.5)"
    }
  }
]

array다른 파일에 이미 존재하는 배열에 이 배열을 추가하려면 다음을 수행할 수 있습니다. 의 최상위 수준에 키가 있고 otherfile입력이 에 있다고 가정합니다 inputfile. 키가 아직 존재하지 않으면 키가 생성됩니다. ):

jq '.array += ( input |
    map(
        select(.auditId == "categories") |
        {
            "type": "section",
            "text": {
                "type": "mrkdwn",
                "text": "*\(.auditProperty):* \(.actual) (expected \(.expected))"
            }
        }
    )
)' otherfile inputfile

실행되면 input명령줄의 두 번째 파일에서 배열을 읽습니다.

기존 키 값을 추가하지 않고 기존 키 값을 바꾸려면 +=just 로 변경하세요.=array

답변2

예, 이것이 []반복자가 하는 일입니다. 각 반복자는 JSON 파일을 가져옵니다. 배열을 얻으려면 전체 표현식을 묶어서 [...]배열을 만들거나 해당 요소를 반복하는 map()대신 입력 배열을 수정하는 데 사용할 수 있습니다.[]

$ echo '[1,2,3,4]' | jq '.[]|select(.<3)'
1
2
$ echo '[1,2,3,4]' | jq '[.[]|select(.<3)]'
[
  1,
  2
]
$ echo '[1,2,3,4]' | jq 'map(select(.<3))'
[
  1,
  2
]

포함 없이 쉼표로 구분된 요소를 사용하여 [배열 ]로 만들면 json이 유효하지 않게 됩니다. 그러나 원하는 경우 파이프를 통해 sed '1d;$d'첫 번째 행과 마지막 행을 제거할 수 있습니다.

관련 정보