Skip to content

Instantly share code, notes, and snippets.

@wifecooky
Last active February 17, 2017 09:31
Show Gist options
  • Save wifecooky/68961023f9eb2f2694f289e5dd000087 to your computer and use it in GitHub Desktop.
Save wifecooky/68961023f9eb2f2694f289e5dd000087 to your computer and use it in GitHub Desktop.
VIM関連

VIMでCSVの列を入れ替える

対象データ

果物,りんご
酒,ウオツカ
調味料,塩

コマンド

:%s/^\([^,]*\),\([^,]*\)/\2,\1/gc

処理結果

りんご,果物
ウオツカ,酒
塩,調味料

説明

では内容を説明していく。

最初の^は行頭という意味。 ( )で囲むとグループという意味になる。ここでは2つのグループを作っている。 [^,]はカンマ以外の文字という意味 *は直前に指定した文字を0回以上繰り返すという意味。 [^,]*でカンマ以外の文字列という意味になる。

検索条件をまとめると、 行頭 カンマ以外の文字列(グループ1) カンマ カンマ以外の文字列(グループ2) に合致する文字列 という意味になる。

つまり (行頭)酒,ウオツカ という文字列が選択される。

次に置換後の内容を説明する。 置換後の文字列は\2,\1 \1や\2は検索条件の中に()で囲ったグループを表している。 最初に現れたのは\1 次は\2 何個もグループを作ったら\3 \4 というように増えていく。

\2、\1 というのは 2番目のグループ カンマ 1番目のグループ に置換すると言う意味になる。

つまり 酒(グループ1) ウオツカ(グループ2)になるので、ウオツカ,酒と並び替えられるわけ。

補足

列の区切りがSpaceの場合は、下記のコマンドとなる。

:%s/^\([^,]*\)\s\([^,]*\)/\2 \1/g

リンク

https://divide-et-impera.org/archives/919

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment