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 jq
→ jq 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的[关闭]