unix - 如何对特定键进行排序

时间:2017-06-06 17:02:27

标签: bash sorting unix command-line

如何对此输出进行排序?

10.1.3.39:{ "range_start" : 96, "range_end" : 96 }
10.1.3.27:{ "range_start" : 33, "range_end" : 33 }
10.1.3.100:{ range_start" : 30, "range_end" : 30 }
10.1.2.233:{ "range_start" : 78, "range_end" : 78 }
10.1.4.239:{ "range_start" : 53, "range_end" : 53 }
10.1.2.161:{ "range_start" : 44, "range_end" : 44 }

我想按range_start

对此输出进行排序

所以,预期会是:

10.1.3.100:{ "range_start" : 30, "range_end" : 30 }
10.1.3.27:{ "range_start" : 33, "range_end" : 33 }
10.1.2.161:{ "range_start" : 44, "range_end" : 44 }
10.1.4.239:{ "range_start" : 53, "range_end" : 53 }
10.1.2.233:{ "range_start" : 78, "range_end" : 78 }
10.1.3.39:{ "range_start" : 96, "range_end" : 96 }

2 个答案:

答案 0 :(得分:2)

你可以这样做decorate, sort, undecorate管道:

$ awk -F",|:" '{printf "%s\t%s\n", $3,$0}' file | sort -n | awk -F"\t" '{print $2}'

或者,如果使用\t或其他唯一分隔符,则可以使用cut

$ awk -F",|:" '{printf "%s\t%s\n", $3,$0}' file | sort -n | cut -f 2

两种情况:

10.1.3.100:{ range_start" : 30, "range_end" : 30 }
10.1.3.27:{ "range_start" : 33, "range_end" : 33 }
10.1.2.161:{ "range_start" : 44, "range_end" : 44 }
10.1.4.239:{ "range_start" : 53, "range_end" : 53 }
10.1.2.233:{ "range_start" : 78, "range_end" : 78 }
10.1.3.39:{ "range_start" : 96, "range_end" : 96 }

如果文本数据中有选项卡,请将\t更改为另一个分隔符。

答案 1 :(得分:1)

这里我们有一个类似JSON的格式,而不是列格式的文本,但我们可以通过仅用空格分隔的字段值进行排序:

sort -n -k 4,4 

会产生所需的输出。

但是,在许多情况下,使用知道格式的解析器会有所帮助。 例如,如果键和值不一致地用空格分隔,则sort的解决方案将失败,例如。

0.1.3.100:{ range_start":30, "range_end" : 30 }

或者如果条目的顺序不一致,例如

0.1.2.233:{ "range_end" : 108, "range_start" : 78 }
10.1.3.39:{ "range_start" : 96, "range_end" : 96 }