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

时间:2014-03-30 03:09:37

标签: json bash sorting awk

我有一个文件中的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 },

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

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

4 个答案:

答案 0 :(得分:12)

自提出问题并回答此问题以来已经过了一段时间。

现在,非hacky方式是使用类似jq的东西:

cat data.json | jq 'sort_by(.d)' >> data_sorted.json

有关详情,请查看网站:

  

jq就像是JSON数据的sed - 你可以用它来切片和过滤,映射和转换结构化数据,就像sed,awk,grep和friends让你玩文本一样轻松。

     

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

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

答案 1 :(得分:3)

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

cat <your file.dat> | sort -n -k 5,7

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

var l = [
    { 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 },
    ...
]
l.sort(function(o1, o2) { return o1.d < o2.d ? -1 : 1 });
console.log(l);

答案 2 :(得分:2)

它是一个黑客攻击,但是如果每条JSON记录都是一行,并且您知道d的值在每行上相同数量的以空格分隔的标记之后开始,那么您可以使用

sort -g -k 20 < in > out

将根据第20个空格分隔的组件以数字方式比较线条。为了增加舒适度,您可以使用-t(可能:)指定不同的分隔符,并根据需要将参数调整为-k,但它仍然是一个黑客:)

sort通常会针对速度进行仔细优化,因此您不太可能找到更快的内容。

答案 3 :(得分:0)

您还可以如下使用GNU的sort

$ sort -t: -k6 -n test.csv
{ x : -4, y :  2.0, as : [ 7, 8, 3 ], str : "zzz", d : 0.002 },
{ x : 12, y : -1.0, as : [ 2, 0, 0 ], str : "xxx", d : 0.041 },
{ x : 44, y :  5.4, as : [ 9, 4, 6 ], str : "kkk", d : 0.176 },
{ x : 27, y : 11.4, as : [ 1, 1, 7 ], str : "yyy", d : 0.235 },

-k标志采用列索引。 -t::用作分隔符,-n则用于数字。

当然,如果您在d之后添加另一个字段,则无法使用此解决方案。在这种情况下,您可以更改-k的值以仅考虑特定字符,例如-k6.2,6.6,但这将假定.之后的位数恰好是3