LoginSignup
10
9

More than 5 years have passed since last update.

VimでCSVファイルの3列目をキーにしてソートする

Last updated at Posted at 2017-11-10

Vimには:sortコマンドが用意されています。これを使えば、バッファ内の行を柔軟にソートすることができます。

:sortの基本

以下のようなファイルに対して、:%sort とすればファイル全体が辞書順でソートされます。

names.txt
charlie
alice
bob
dave
eve

以下のように数値であれば、nオプションをつけて:%sort nとすれば数値順でソートされます。

number.txt
100
10
1

CSVを3列目でソートする

以下のようなファイルを開いているとします。:%sort /,\zs[^,]*\ze$/ nrを入力します。

sample.csv
alice,5,10000
bob,4,1000
charlie,1,1
dave,8,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 /\([^,]*,\)\{2\}\zs[^,]*/ r とします。2を書き換えれば任意のカラムでソート可能です。4列目をキーとしたければ、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

10
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9