json - Bash sqlite3 行 |如何转换成JSON格式

标签 json bash awk sqlite grep

我想将我的 sqlite 数据从我的数据库转换为 JSON 格式。

我想使用这个语法:

sqlite3 -line members.db "SELECT * FROM members LIMIT 3"> members.txt

输出:

      id = 1
   fname = Leif
   gname = Håkansson
genderid = 1

      id = 2
   fname = Yvonne
   gname = Bergman
genderid = 2

      id = 3
   fname = Roger
   gname = Sjöberg
genderid = 1

如何在 for 循环中使用漂亮且结构化的代码来做到这一点? (仅在 Bash 中)

我已经尝试了一些 awk 和 grep,但还没有取得很大的成功。

如果有一些提示会很好。

我想要类似这样的结果:

[
  {
    "id":1,
    "fname":"Leif",
    "gname":"Hakansson",
    "genderid":1
  },
  {
    "id":2,
    "fname":"Yvonne",
    "gname":"Bergman",
    "genderid":2
  },
  {
    "id":3,
    "fname":"Roger",
    "gname":"Sjberg",
    "genderid":1
  }
}

最佳答案

如果你的 sqlite3 是用 json1 扩展编译的(或者如果你可以获得一个带有 json1 扩展的 sqlite3 版本),那么你可以用它来生成 JSON 对象(每行一个 JSON 对象)。例如:

select json_object('id', id, 'fname', fname, 'gname', gname, 'genderid', genderid) ...

然后您可以使用 jq 等工具将对象流转换为对象数组,例如将 sqlite3 的输出通过管道传输到 jq -s .

(一个不那么麻烦的替代方法可能是使用 sqlite3 函数 json_array(),它会生成一个数组,您可以使用 jq 将其重新组合成一个对象。)

如果 json1 扩展不可用,那么您可以使用以下内容作为起点:

awk 'BEGIN { print "["; } 
 function out() {if (n++) {print ","}; if (line) {print "{" line "}"}; line="";}
 function trim(x) { sub(/^ */, "", x); sub(/ *$/, "", x); return x; }
 NF==0 { out(); next}; 
 {if (line) {line = line ", " }
  i=index($0,"="); 
  line = line "\"" trim(substr($0,1,i-1)) ": \"" substr($0, i+2) "\""}
 END {out(); print "]"} '

或者,您可以使用以下 jq 脚本,它将出现在“=”的 RHS 上的数字字符串转换为数字:

  def trim: sub("^ *"; "") | sub(" *$"; "");
  def keyvalue: index("=") as $i 
    | {(.[0:$i] | trim): (.[$i+2:] | (tonumber? // .))};
  [foreach (inputs, "") as $line ({object: false, seed: {} };
     if ($line|trim) == "" then { object: .seed, seed : {} }
     else {object: false, 
           seed: (.seed + ($line | keyvalue)) }
     end;
     .object | if . and (. != {}) then . else empty end ) ]

关于json - Bash sqlite3 行 |如何转换成JSON格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36048347/

相关文章:

linux - 如何在 unix 中删除文件的最后一个字符?

bash - shell脚本: Indirect recursion doesn't work as expected (too many repetitions)

linux - 在特定时间戳之间解析文件内容

linux - 使用 Javascript 运行远程命令

javascript - AngularJS 过滤不是对象数组的 JSON 对象 {}

python - 如何在 R/Python 中迭代/循环大型(>2GB)JSON 数据集?

c++ - QT 读取 JSON 文件并存储和检索值

ruby-on-rails - 在 Rails 中覆盖 MIME 类型

python - 修复列 "date_of_birth"中的空值违反了非空约束

bash - 使用 sed/awk/grep 更改配置变量或添加它(如果它不存在)