Json 连续拟合数字并在每个 1-9 数字前添加一个 0

Posted

技术标签:

【中文标题】Json 连续拟合数字并在每个 1-9 数字前添加一个 0【英文标题】:Json get fitting the numbers in a row and add a 0 in front of every 1-9 number 【发布时间】:2021-09-10 03:49:59 【问题描述】:

在 bash 中,我想让 .txt 文件在第 1 行中包含链接。在第 2 行中包含数字。

curl -s "http://kodi:kodi@192.168.1.10:8080/jsonrpc?Base" -H 'Content-Type: application/json' --data '["jsonrpc":"2.0","method":"Player.GetProperties","params":[1,["time"]],"id":17,"jsonrpc":"2.0","method":"Player.GetItem","params":[1,["file"]],"id":18]' | jq

带有jq的json文件格式

[
  
    "id": 17,
    "jsonrpc": "2.0",
    "result": 
      "time": 
        "hours": 2,
        "milliseconds": 200,
        "minutes": 3,
        "seconds": 5
      
    
  ,
  
    "id": 18,
    "jsonrpc": "2.0",
    "result": 
      "item": 
        "file": "plugin://plugin.video.youtube/play/?video_id=rhMTZB2WJWA",
        "label": "FULL SHOW - Burton US Open Men's Slopestyle Semi-Finals",
        "type": "unknown"
      
    
  
]
curl -s "http://kodi:kodi@192.168.1.10:8080/jsonrpc?Base" -H 'Content-Type: application/json' --data '["jsonrpc":"2.0","method":"Player.GetProperties","params":[1,["time"]],"id":17,"jsonrpc":"2.0","method":"Player.GetItem","params":[1,["file"]],"id":18]' | jq --raw-output '.[].result.item.file, .[].result.time.hours, .[].result.time.minutes, .[].result.time.seconds | select(. != null)' > "c:\kodi\info.txt"

有了这个我可以在 info.txt 文件中得到这个格式

info.txt

plugin://plugin.video.youtube/play/?video_id=rhMTZB2WJWA
2
3
5

示例 2。

plugin://plugin.video.youtube/play/?video_id=rhMTZB2WJWA
0
11
22

示例 3。

plugin://plugin.video.youtube/play/?video_id=rhMTZB2WJWA
0
55
9

online jq play link

如何用 jq、awk、paste、sed 或类似的东西来让它看起来像这样并在每个 1-9 前面放一个 0?

example 1.
plugin://plugin.video.youtube/play/?video_id=rhMTZB2WJWA
020305
    
example 2.
plugin://plugin.video.youtube/play/?video_id=rhMTZB2WJWA
001122

example 3. 
plugin://plugin.video.youtube/play/?video_id=rhMTZB2WJWA
005509

提前感谢您的帮助!

【问题讨论】:

我怀疑在 github.com/stedolan/jq/issues/1341 完成之前,仅使用 jq 可能无法做到这一点。 @jordanm thx 的回复实际上我可以与其他东西结合使用,例如| awk '命令' | jq '命令' | sed 'command' > .txt 与任何这些组合必须有人可以帮助我 您的问题中有几个文本块,请edit 它清楚地说明哪个是您的示例输入,哪个是您的预期输出。我认为最后一个块可能是预期的输出,但是文本 example 1. 来自哪里,应该是来自 3 个单独文件的 3 个单独输出还是其他什么?请把它清理干净并说清楚。 @EdMorton 好的,抱歉,只是尽量不要错过任何东西,我会修复它 可以使用printf 进行这种格式设置...即` printf '%02d%02d%02d' $(printf '1\n2\n3\n' | xargs) ` 给你010203 ...所以,获取您在其中创建 info.txt 的流,将其通过管道传输到 xargs,然后使用这些 args 调用 printf 来格式化这些 args 【参考方案1】:

完全使用jq

jq --raw-output '[.[].result] | add | .item.file, ( .time | .hours * 3600 + .minutes * 60 + .seconds | strftime("%H%M%S") )'

带有 cmets 的 jq 脚本:

jqscript:

#!/usr/bin/env -S jq -fr

# Merge all result entries into a single object
[.[].result] | add |

# Output the file url
  .item.file,

# Output a formatted time
  (
    # Using the time object
    .time |
      # Compute a timestamp in seconds
      .hours * 3600 + .minutes * 60 + .seconds |
        # Format the timestamp to requirement
        strftime("%H%M%S")
  )

input.json

[
  
    "id": 17,
    "jsonrpc": "2.0",
    "result": 
      "time": 
        "hours": 2,
        "milliseconds": 200,
        "minutes": 3,
        "seconds": 5
      
    
  ,
  
    "id": 18,
    "jsonrpc": "2.0",
    "result": 
      "item": 
        "file": "plugin://plugin.video.youtube/play/?video_id=rhMTZB2WJWA",
        "label": "FULL SHOW - Burton US Open Men's Slopestyle Semi-Finals",
        "type": "unknown"
      
    
  
]

跑步:

./jqscript input.json

输出:

plugin://plugin.video.youtube/play/?video_id=rhMTZB2WJWA
020305

【讨论】:

当我使用jq-1.6 运行该单行脚本时,我得到parse error: Invalid numeric literal at line 2, column 0。我不知道jq 足以调试它。 @LéaGris 谢谢(我用 .sh 文件对其进行了测试)这也是一个很好的解决方案! @EdMorton 如果您尝试使用在线 jq,请将其粘贴到 FILTER .[0].result + .[1].result | .item.file, ( .time | .hours * 3600 + .minutes * 60 + .seconds | strftime("%H%M%S") ) 中,如果您查看命令行部分的底部,请检查原始输出,它看起来像 Léa 所写的 @ÁdámHegedüs 我毫不怀疑它适用于某些版本的jq @EdMorton 使用 dpkg-query --show jqjq 1.6-1ubuntu0.20.10.1【参考方案2】:

一个awk想法:

awk '
FNR==1 print;next          # print line 1 as is
       printf "%02d",$1    # print all other lines on 2nd line (notice no "\n"),
                             # left padding numbers with "0" to 2 digits
END    printf "\n"         # print EOL
' file

假设 3 个样本数据在文件 file1..3 中:

for f in file1..3
do
    echo "+++++++++++ $f"
    awk 'FNR==1 print;next printf "%02d",$1 END printf "\n"' "$f"
done

这会生成:

+++++++++++ file1
plugin://plugin.video.youtube/play/?video_id=rhMTZB2WJWA
020305
+++++++++++ file2
plugin://plugin.video.youtube/play/?video_id=rhMTZB2WJWA
001122
+++++++++++ file3
plugin://plugin.video.youtube/play/?video_id=rhMTZB2WJWA
005509

【讨论】:

printf "\n" = print ""。 nbd 但print "" 稍微简洁一些,适用于任何 ORS 值,而不是假设 ORS 为 "\n" @markp-fuso 感谢您的回答和解释,效果很好!:)

以上是关于Json 连续拟合数字并在每个 1-9 数字前添加一个 0的主要内容,如果未能解决你的问题,请参考以下文章

将数字转换为二进制并在java中以二进制数计数连续1的[关闭]

Python - 计算熊猫行字符串上的连续前导数字而不计算非连续数字

在php中生成连续数字[关闭]

如何在一个范围内添加非连续数字?

如何识别列中的数字并在该数字中添加特定数字

PHP JSON 将输出数字编码为字符串