如何给文本行排序

Emacs内置的函数可以很方便地对文本排序。假如有以下两列文本:

1 x
3 xxx
20 xxxxxxxxxxxxxxxxxxxx
4 xxxx
2 xx
10 xxxxxxxxxx
9 xxxxxxxxx

现在要按第一列的数字进行排序:

  1. 标记这段文本
  2. M-x sort-numeric-fields

结果如下:

1 x
2 xx
3 xxx
4 xxxx
9 xxxxxxxxx
10 xxxxxxxxxx
20 xxxxxxxxxxxxxxxxxxxx

如果要逆序,标记结果文本:

M-x reverse-region

结果如下:

20 xxxxxxxxxxxxxxxxxxxx
10 xxxxxxxxxx
9 xxxxxxxxx
4 xxxx
3 xxx
2 xx
1 x

Emacs还有另一个按ASCII码排序的函数sort-lines,注意它不是按数字来排序,比如我们把刚才的文本排下序,结果如下:

1 x
10 xxxxxxxxxx
2 xx
20 xxxxxxxxxxxxxxxxxxxx
3 xxx
4 xxxx
9 xxxxxxxxx

但这个函数可以很方便地用来排序日期,比如我统计了一些数据如下:

2014-09-23 10
2014-09-24 85
2014-09-25 146
2014-10-01 140
2014-09-26 161
2014-10-02 13
2014-09-27 14
2014-10-03 1
2014-09-28 16
2014-10-04 1370
2014-09-29 182
2014-09-30 14
2014-10-05 136
2014-10-06 141144
2014-09-20 1215
2014-10-07 135
2014-09-21 45
2014-10-08 144
2014-09-22 5419
2014-10-09 5199
2014-10-10 1591

为了方便展示,现在需要对它们按日期排序:

  1. 标记这段文本
  2. M-x sort-lines

结果如下:

2014-09-20 1215
2014-09-21 45
2014-09-22 5419
2014-09-23 10
2014-09-24 85
2014-09-25 146
2014-09-26 161
2014-09-27 14
2014-09-28 16
2014-09-29 182
2014-09-30 14
2014-10-01 140
2014-10-02 13
2014-10-03 1
2014-10-04 1370
2014-10-05 136
2014-10-06 141144
2014-10-07 135
2014-10-08 144
2014-10-09 5199
2014-10-10 1591

如果要降序:

C-u M-x sort-lines

结果如下:

2014-10-10 1591
2014-10-09 5199
2014-10-08 144
2014-10-07 135
2014-10-06 141144
2014-10-05 136
2014-10-04 1370
2014-10-03 1
2014-10-02 13
2014-10-01 140
2014-09-30 14
2014-09-29 182
2014-09-28 16
2014-09-27 14
2014-09-26 161
2014-09-25 146
2014-09-24 85
2014-09-23 10
2014-09-22 5419
2014-09-21 45
2014-09-20 121

更多参考