Vimには:sort
コマンドが用意されています。これを使えば、バッファ内の行を柔軟にソートすることができます。
:sort
の基本
以下のようなファイルに対して、:%sort
とすればファイル全体が辞書順でソートされます。
names.txt
charlie
alice
bob
dave
eve
以下のように数値であれば、n
オプションをつけて:%sort n
とすれば数値順でソートされます。
number.txt
100
10
1
CSVを3列目でソートする
以下のようなファイルを開いているとします。:%sort /,[^,]*$/ nr
を入力します。
sample.csv
charlie,1,1
alice,5,10000
bob,4,1000
dave,3,100
eve,2,10
すると、3列目でソートしたファイルが得られます。
sample.csv
charlie,1,1
eve,2,10
dave,8,100
bob,4,1000
alice,5,10000
もっと汎用的に考えてみます。以下のファイルがあったときに、任意のカラムでソートしたいとします。ソートのキーとなるカラムは数値で指定するとしましょう。
sample2.csv
alice,5,10000,d
bob,4,1000,e
charlie,1,1,a
dave,8,100,b
eve,2,10,c
3列目をソートしたければ、 :%sort /\([^,]*,\)\{3\}\zs[^,]*/ r
とします。3
を書き換えれば任意のカラムでソート可能です。
応用
CSVはシェル・コマンドのsort
で簡単にソートできますが、Vimのソートはより柔軟です。
以下のようなPHPファイルがあると仮定します。
before.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
を打つと部署をキーとしてソートした結果が得られます。
after.php
<?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