형식화된 인쇄에 jq를 사용하는 방법은 무엇입니까?

형식화된 인쇄에 jq를 사용하는 방법은 무엇입니까?

jq숫자를 문자열로 변환하거나 문자열을 연결하는 기능이 내장되어 있습니다. 패딩(%4s)
과 유사하게 jq에서 문자열 형식을 지정하는 방법입니다 .printf

예를 들어, 숫자를 왼쪽 정렬하고 10자의 공백을 차지하도록 하려면 어떻게 해야 할까요?
echo '{"title" : "A sample name", "number" : 1214}' | jq '(.title) + " " + (.number | tostring)'

답변1

jq인용된 문자열 내에서 표현식을 사용할 수 있습니다.\(foo)

문자열 보간 -\(foo)

문자열 내에서 백슬래시 뒤의 괄호 안에 표현식을 넣을 수 있습니다. 표현식이 반환하는 모든 내용이 문자열에 삽입됩니다.

jq '"The input was \(.), which is one less than \(.+1)"' <<<  42

결과:

"The input was 42, which is one less than 43"

답변2

한 가지 접근 방식은 셸에서 이 작업을 수행하는 것이 아니라 출력 셸 문을 jq사용하여 jq셸에서 수행하는 것입니다.

eval "$(
    jq -r -n '
        { "title": "A sample name", "number": 1214 } |
        [ "printf", "%s %10s\\n", .title, .number ] | @sh'
)"

또는,

eval "$(
    printf '%s\n' '{ "title": "A sample name", "number": 1214 }' |
    jq -r '[ "printf", "%s %10d\\n", .title, .number ] | @sh'
)"

또는,

printf '%s\n' '{ "title": "A sample name", "number": 1214 }' |
{
    eval "$(
        jq -r '[ "printf", "%s %10s\\n", .title, .number ] | @sh'
    )"
}

jq명령은 다음을 출력합니다.

'printf' '%s %10d\n' 'A sample name' 1214

연산자를 사용하면 @sh명령의 모든 부분을 정확하게 인용할 수 있습니다. 평가되면 다음이 출력됩니다.

A sample name       1214

비슷한 접근 방식이지만 값을 할당할 수 있는 두 가지 변수를 제공합니다.

jq -r -n '
    { "title": "A sample name", "number": 1214 } |
    @sh "title=\(.title)",
    @sh "number=\(.number)"'

그런 다음 스크립트에서 다음 변수를 사용할 수 있습니다.

unset -v title number

eval "$(
    jq -r -n '
        { "title": "A sample name", "number": 1214 } |
        @sh "title=\(.title)",
        @sh "number=\(.number)"'
)"

printf '%s %10s\n' "$title" "$number"

알려진 데이터의 경우좋아요(예를 들어 제목에는 개행 문자를 포함할 수 없습니다.) 다음을 수행할 수 있습니다.

jq -r -n '
    { "title": "A sample name", "number": 1214 } |
    [ .title, .number ] | @sh' |
xargs printf '%s %10s\n'

printf즉, 데이터를 셸에 전달하기 전에 데이터가 인용되어 있는지 확인하세요.외부유틸리티 printf, 내장 쉘이 아님).

답변3

jq를 포함하지 마십시오 printf. 한 가지 접근 방식은 다음과 같습니다.여기 에서 가져온 부분:

echo '{"title" : "A sample name", "number" : 1214}' | 
jq '(.title) + " " + 
    (.number | tostring | (" " * (10 - length)) + .)'

어쩌면 모듈로 추가하는 것이 더 나을 수도 있습니다.


개인적으로 저는 jq약간 혼란스러운 코드 줄을 빨리 발견하고 Perl, Python, PHP 또는 유사한 언어에 의존합니다.기본 이상의 일을 한다면.(그게 바로 나야 :P)

예를 들어, PHP를 사용하면:

#! /usr/bin/env php
<?php

$data = json_decode(file_get_contents("php://stdin"));

printf("%s: %10d\n", $data->title, $data->number);

?>

(물론 오류 검사 등도 추가될 예정입니다.)

관련 정보