Vimには:sort
コマンドが用意されています。これを使えば、バッファ内の行を柔軟にソートすることができます。
:sort
の基本
以下のようなファイルに対して、:%sort
とすればファイル全体が辞書順でソートされます。
charlie
alice
bob
dave
eve
以下のように数値であれば、n
オプションをつけて:%sort n
とすれば数値順でソートされます。
100
10
1
CSVを3列目でソートする
以下のようなファイルを開いているとします。:%sort /,\zs[^,]*\ze$/ nr
を入力します。
alice,5,10000
bob,4,1000
charlie,1,1
dave,8,100
eve,2,10
すると、3列目でソートしたファイルが得られます。
charlie,1,1
eve,2,10
dave,8,100
bob,4,1000
alice,5,10000
もっと汎用的に考えてみます。以下のファイルがあったときに、任意のカラムでソートしたいとします。ソートのキーとなるカラムは数値で指定するとしましょう。
alice,5,10000,d
bob,4,1000,e
charlie,1,1,a
dave,8,100,b
eve,2,10,c
3列目をキーとしたければ、 :%sort /\([^,]*,\)\{2\}\zs[^,]*/ r
とします。2
を書き換えれば任意のカラムでソート可能です。4列目をキーとしたければ、3
とします。
応用
CSVはシェル・コマンドのsort
で簡単にソートできますが、Vimのソートはより柔軟です。
以下のようなPHPファイルがあると仮定します。
<?php
$users = [
['name' => 'P=NP', 'department' => 'Production'],
['name' => 'alice', 'department' => 'Planning'],
['name' => '=bob=', 'department' => 'Customer Support'],
['name' => 'eve', 'department' => 'Planning'],
['name' => 'dave', 'department' => 'Sales'],
['name' => 'jack', 'department' => 'Human Resources'],
['name' => 'kay', 'department' => 'Human Resources'],
];
ここに対して、 ソート箇所をVisualモードで選択し、 :'<,'>sort /department' => '\zs[^']*\ze'/ r
を打つと部署をキーとしてソートした結果が得られます。
<?php
$users = [
['name' => '=bob=', 'department' => 'Customer Support'],
['name' => 'jack', 'department' => 'Human Resources'],
['name' => 'kay', 'department' => 'Human Resources'],
['name' => 'alice', 'department' => 'Planning'],
['name' => 'eve', 'department' => 'Planning'],
['name' => 'P=NP', 'department' => 'Production'],
['name' => 'dave', 'department' => 'Sales'],
];
tips
正規表現を書きたくない人で、シェルコマンドが分かる人なら、:%!sort -t',' -k=3
としてもソートできます。
詳しくは
:help :sort