使用命令行工具对JSON/JavaScript元组进行排序

Phi*_*ppe 6 sorting bash awk json

我有一个文件中的JavaScript元组列表,每行一个,如下:

{ x : 12, y : -1.0, as : [ 2, 0, 0 ], str : "xxx", d : 0.041 },
{ x : 27, y : 11.4, as : [ 1, 1, 7 ], str : "yyy", d : 0.235 },
{ x : -4, y :  2.0, as : [ 7, 8, 3 ], str : "zzz", d : 0.002 },
{ x : 44, y :  5.4, as : [ 9, 4, 6 ], str : "kkk", d : 0.176 },
Run Code Online (Sandbox Code Playgroud)

我想根据给定字段的值(d我的示例中的字段)对它们进行排序,最好使用命令行工具(这是包含许多步骤的过程的一部分).

如果它有任何区别,我们可以假设所有行都具有完全相同的长度(我可以知道值的开始和结束索引d),尽管我更喜欢不依赖于此的解决方案.

Ash*_*man 15

自从提出这个问题并得到回答以来已经过了一段时间.

这些天,非hacky方式是使用像jq这样的东西:

cat data.json | jq 'sort_by(.d)' >> data_sorted.json
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请查看网站:

jq就像是用于JSON数据的sed - 你可以用它来切片和过滤,映射和转换结构化数据,同样方便sed,awk,grep和朋友让你玩文本.

- https://stedolan.github.io/jq/

如果由于某种原因你不喜欢jq,有很多选择

  • sort_by断言输入将是一个数组.如果文件的每一行都是一个json对象,并且你想按某些字段对行进行排序,你可以将其作为`cat sample.json | jq -s -c'sort_by(.d)| .[]'`.选项-s会将所有行读入数组.从http://bigdatums.net/2016/11/29/sorting-json-by-value-with-jq/获取这个想法 (2认同)

Tee*_*nen 4

如果可以保证所有字段的大小相同,则可以使用排序命令。例如,这按列 x 值进行数字排序。

\n\n
cat <your file.dat> | sort -n -k 5,7\n
Run Code Online (Sandbox Code Playgroud)\n\n

您此处作为示例的数据不是有效的 JSON,而是 javascript 语法。一种方法是包装文件,使其成为有效的 javascript 程序并在 node.js 命令行中运行它,

\n\n
var l = [\n    { x : 12, y : -1.0, as : [ 2, 0, 0 ], str : "xxx", d : 0.041 },\n    { x : 27, y : 11.4, as : [ 1, 1, 7 ], str : "yyy", d : 0.235 },\n    ...\n]\nl.sort(function(o1, o2) {\xc2\xa0return o1.d < o2.d ? -1 : 1 });\nconsole.log(l);\n
Run Code Online (Sandbox Code Playgroud)\n