输入数据.json
{
"lastUpdateTime" : "2018-07-20T10:56:26.000Z",
"items" : [ {
"date" : "2018-07-19T21:09:27.000Z",
"user" : "dddd",
"size" : 5219402,
"rawSize" : 15658206,
"numFiles" : 119
}, {
"date" : "2018-07-19T21:09:27.000Z",
"user" : "aaaa",
"size" : 20524410845,
"rawSize" : 61573215663,
"numFiles" : 7540
}, {
"date" : "2018-07-19T21:09:27.000Z",
"user" : "wwww",
"size" : 0,
"rawSize" : 0,
"numFiles" : 2
}, {
"date" : "2018-07-19T21:09:27.000Z",
"user" : "qqqq",
"size" : 201084,
"rawSize" : 603252,
"numFiles" : 25
}, {
"date" : "2018-07-19T21:09:27.000Z",
"user" : "ttttt",
"size" : 280395332,
"rawSize" : 288900666,
"numFiles" : 199
} ]
}
预期输出
User Size
aaa 121
bbb 123
如何将 JSON 转换为上表?请帮帮我。
答案1
好吧,虽然我完全同意 @gronostaj 关于不要使用awk
或sed
作为 JSON 的解析工具,但我知道有时除了操作系统自带的工具之外你不能使用任何其他东西。
如果您绝对确定您发布的 JSON 将始终采用与您发布的格式相同的格式,则解决方案如下:
#!/bin/sh
data='
{
"lastUpdateTime" : "2018-07-20T10:56:26.000Z",
"items" : [ {
"date" : "2018-07-19T21:09:27.000Z",
"user" : "dddd",
"size" : 5219402,
"rawSize" : 15658206,
"numFiles" : 119
}, {
"date" : "2018-07-19T21:09:27.000Z",
"user" : "aaaa",
"size" : 20524410845,
"rawSize" : 61573215663,
"numFiles" : 7540
}, {
"date" : "2018-07-19T21:09:27.000Z",
"user" : "wwww",
"size" : 0,
"rawSize" : 0,
"numFiles" : 2
}, {
"date" : "2018-07-19T21:09:27.000Z",
"user" : "qqqq",
"size" : 201084,
"rawSize" : 603252,
"numFiles" : 25
}, {
"date" : "2018-07-19T21:09:27.000Z",
"user" : "ttttt",
"size" : 280395332,
"rawSize" : 288900666,
"numFiles" : 199
} ]
}
'
###########################################################
echo "${data}" | awk -F: 'BEGIN{
printf ("%s\t\t%s\t%s\n","Date", "User", "Size")
}
/lastUpdateTime/ {next}
/date/ { gsub(/\"|,|\s/,""); gsub(/T.+$/,""); printf ("%s\t", $2) }
/user/ { gsub(/\"|,|\s/,""); printf ("%s\t", $2) }
/size/ { gsub(/\"|,|\s/,""); printf ("%s\n", $2) }
'
答案2
唯一正确的答案是:
不。
awk
并且sed
不是适合这项工作的工具。您将无法正确处理 JSON 转义和编码。您可以尝试涵盖一些基本情况,但您也可以使用合适的工具:杰奇。
jq
解决方案
jq '.items[] | "\(.user) \(.size)"' -r /path/to/file
(或者,您可以将 JSON 导入命令中,而不是从文件中读取它)
要对齐列:
jq '.items[] | "\(.user) \(.size)"' -r /path/to/file | column -t