我有包含多个 JSON 对象的文件,需要将它们转换为 JSON。我安装了 bash 和 Excel,但无法安装任何其他工具。
{"name": "a","age":"17"}
{"name":"b","age":"18"}
至:
[{"name": "a","age":"17"},
{"name":"b","age":"18"}]
我有包含多个 JSON 对象的文件,需要将它们转换为 JSON。我安装了 bash 和 Excel,但无法安装任何其他工具。
{"name": "a","age":"17"}
{"name":"b","age":"18"}
至:
[{"name": "a","age":"17"},
{"name":"b","age":"18"}]
假设每行一个对象,如 OP 问题所示
echo -n "["; while read line; do echo "${line},"; done < <(cat test.txt) | sed -re '$ s/(.*),/\1]/'
结果:
[{"name": "a","age":"17"},
{"name":"b","age":"18"}]
假设:
样本输入:
$ cat raw.dat
{"name": "a","age":"17"}
{"name":"b","age":"18"}
{"name":"C","age":"23"}
一个awk
想法:
awk 'BEGIN {pfx="["} {printf "%s%s",pfx,$0; pfx=",\n"} END {printf "]\n"}' raw.dat
在哪里:
printf
是没有终止换行符的行pfx
)[
pfx
) 设置为,\n
(即,用 终止前一行,\n
)printf "]\n"
这会产生:
[{"name": "a","age":"17"},
{"name":"b","age":"18"},
{"name":"C","age":"23"}]
确保@chepner 的评论(回复:sed
解决方案)不会在混合中丢失:
sed '1s/^/[/;2,$s/^/,/;$s/$/]/' raw.dat
这会产生:
[{"name": "a","age":"17"}
,{"name":"b","age":"18"}
,{"name":"C","age":"23"}]
注意:如果@chepner 想将此作为答案发布,我可以将其删除。
灵感来自https://askubuntu.com/a/475804
awk '(NR==FNR){count++} (NR!=FNR){ if (FNR==1) printf("["); printf("%s", $0); print (FNR==count)?"]":"," } END {if (count==0) print "[]"}' file file
一个不太紧凑但更易读的版本:
awk '
(NR==FNR) {
count++;
}
(NR!=FNR) {
if (FNR==1)
printf("[");
printf("%s", $0);
if (FNR==count)
print "]";
else
print ",";
}
END {
if (count==0) print "[]";
}' file file
诀窍是将同一个文件两次提供给awk
. 因为NR==FNR
对于第一个文件总是如此,所以有一个专门用于计算变量行数的第一个解析count
。
第二个解析NR!=FNR
将为每一行应用以下算法:
[
第一行printf
代替print
以避免换行符结束]
或写入,使用以换行符结尾,
print
该END
命令只是在文件为空的情况下输出空数组的故障保护。