-2

我有包含多个 JSON 对象的文件,需要将它们转换为 JSON。我安装了 bash 和 Excel,但无法安装任何其他工具。

{"name": "a","age":"17"}
{"name":"b","age":"18"}

至:

[{"name": "a","age":"17"},
{"name":"b","age":"18"}]
4

3 回答 3

2

假设每行一个对象,如 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"}]
于 2021-08-30T16:18:48.070 回答
0

假设:

  • 无需(重新)格式化输入数据

样本输入:

$ 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 想将此作为答案发布,我可以将其删除。

于 2021-08-30T17:44:33.013 回答
0

灵感来自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命令只是在文件为空的情况下输出空数组的故障保护。

于 2021-08-30T16:34:05.133 回答