Bash

如何用jq進行格式化列印?

  • November 5, 2021

jq具有將數字轉換為字元串或連接字元串的內置功能。

如何在 jq 中格式化字元串,printf類似於填充(%4s)。

例如,如何強制數字佔據 10 個字元空間並左對齊?

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

一種方法是不嘗試在 中執行此操作jq,而是使用jq輸出 shell 語句在 shell 中執行此操作:

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'

也就是說,確保引用數據,然後將其傳遞給printfshell(這將呼叫外部實用程序printf,而不是內置的 shell)。

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);

?>

(當然也會添加錯誤檢查等。)

引用自:https://unix.stackexchange.com/questions/659216