大きなcsvを手に入れたけど欲しいのは特定の列の合計値だけなんだよって事良くありますよね。
名前,血液型,スコア,性別
alice,A,232,1
bob,B,659,0
charlie,O,120,0
dave,AB,923,0
...(以下1000行ぐらい)
この中でスコアの部分だけ合計したいというケースに直面したとします。
それもできる限り少ないタイプ数で。
まず一番上の行を消します。C-k
alice,A,232,1
bob,B,659,0
charlie,O,120,0
dave,AB,923,0
...(以下1000行ぐらい)
スコア列までの左2列が邪魔ですね。消しましょう。
次にaliceのaにカーソルを合わせF3→C-@→C-s→,→C-s→C-f→C-b→C-w→C-n→F4と押します。
個々のコマンドを説明すると。
-
F3: これからマクロ作るから覚えて -
C-@: ここから範囲選択開始 -
C-s: 検索してカーソルジャンプ -
,:,のある所までカーソルを動かして(ここでalice,の所まで飛ぶ) -
C-s: 次のコンマ、つまりA,の所までジャンプ(これでA,まで飛ぶ) -
C-f: カーソルを1個右に動かして検索ジャンプを抜け出す -
C-b: カーソルを1個左に動かしてコンマの上まで戻る -
C-w: 範囲選択の開始位置から今のカーソル位置までを切り取り(これで1行目のalice,A,の部分が全部消える) -
C-n: カーソルを1個下へ -
F4: 最初のF3からここまでの操作をマクロとして記録
ここまで操作するとEmacs上の画面はこんな感じになるはずです。
232,1
bob,B,659,0
charlie,O,120,0
dave,AB,923,0
...(以下1000行ぐらい)
カーソル位置は2行目のbobの最初の所にあるはず。
ここでC-u→999999→F4と押します。
個々の操作を説明すると
C-u: これから打つ数字の回数分、その後のコマンドを繰り返せ
999999: 99万9999回操作を繰り返せ(大きい数字なら何でも良い)
F4: マクロを上記の回数実行(行末まで行ったら勝手に止まる)
すると画面はこんなかんじになります。
232,1
659,0
120,0
...(間に1000行ぐらい)
456,1
123,0
さっきの操作がファイルの終わりまで繰り返されたので、全部の行で2個目のコンマまでが全部消えました。
1行分のコンマを消した最後にC-nで次の行に移っているので単純な繰り返しで全部の行に操作が実行されます。気になる人はF4コマンドを何度か押して試してみると良いです。
さて、次はコンマから右の1列が邪魔ですね。消しましょう。
カーソルがバッファの一番下に来ているので、ここから作業します。
一番下の行の左端(123の1)にカーソルが居るとしてコマンドを打ちます。
F3→C-s→,→C-b→C-k→C-a→C-p→F4
個々のコマンドを説明すると
F3: ここからマクロ記録開始
C-s: 検索してカーソルジャンプ
,: ,のある位置まで移動(これで123,1の行の123,0にカーソルが飛ぶ)
C-b: カーソルを1個左にずらす(ついでに検索モードも終わる)
C-k: 今いる位置から右を切り取る
C-a: 行頭へ移動(これで123の1の部分へカーソルが飛ぶ)
C-p: 1行上へ移動
F4: 最初のF3からの操作をマクロとして記録
するとこんな感じになります。
232,1
659,0
120,0
...(間に1000行ぐらい)
456,1
123
カーソル位置は下から2行目の456の4の位置に居ると思います。
ここでさっきと同じようにF4を繰り返させましょう。
C-u→999999→F4
意味はさっきのコマンドと全く同一です。
すると結果としてこんな感じになります。
232
659
120
...(間に1000行ぐらい)
456
123
後は足すだけです。最初の行の前に(+と書いた行を挿入し、最後の行の後に)と書いた行を挿入します。
(+
232
659
120
...(間に1000行ぐらい)
456
123
)
これだけで、数字の羅列がEmacsに理解できるEmacs LispになるのでS式として計算ができるようになります。
最後の行の)のすぐ右にカーソルを合わせてC-x→C-eと押します。
するとステータスバーに足し算の答えが出ます。お疲れ様でした。
マクロの力でS式をゴリゴリ作る方法は応用の幅が広いのでオススメです。
こう打ったらもっと短く済むよ、というのが有ったら教えて頂けると嬉しいです。