回答:
Linuxでは、私はMacを想定していますが、リージョンをuniq
シェルコマンドにパイプして、ほぼ正確に必要なものを取得できます。
地域をマーク
行を並べ替える M-x sort-lines
shell-command-on-region
プレフィックスキーで呼び出します:C-u M-|
入る uniq --count
バッファの内容は次のものに置き換えられます:
3 THIS IS LINE A
2 THIS IS LINE B
1 THIS IS LINE C
これをキーボードマクロなどでさらに自動化できますが、これで十分です。
編集:@philsが指摘しているように、Emacs関数ではなくシェルコマンドを使用してソートを行うことができます。この場合は、ステップ2をドロップし、ステップ4の場合は、のsort | uniq -c
代わりにを入力しuniq -c
ます。
-c
と--count
同義語であり、そしてあなたがソートする必要がありますか、多分Mac版は異なるデフォルトを使用しています。ステップ1を修正します!
ssh
走っている箱に入りましたUbuntu 14.04.1 LTS
:それでも私にとってソートは必要ありません。
C-u M-|
sort | uniq -c
ここには3つのタスクがあります。
(defun uniqify-lines (beg end)
"Return a list of lines in a region (without duplicates). Omit empty lines."
(let ((text (buffer-substring beg end)))
(with-temp-buffer
(insert text)
(delete-duplicate-lines (point-min) (point-max))
(split-string (buffer-string) "\n" t))))
(defun count-duplicates (beg end)
"Count duplicate lines in a region. Returns a list of the
form ((line . count) ...)."
(mapcar (lambda (str)
(cons str (how-many (regexp-quote str) beg end)))
(uniqify-lines beg end)))
(defun insert-line-stats (beg end)
"Remove duplicate lines in the region. Append the number of
occurences to each line in the result. Replaces current region."
(interactive "r")
(let ((stats (count-duplicates beg end)))
(kill-region beg end)
(mapc (lambda (line)
(insert (format "%s %d\n" (car line) (cdr line))))
stats)))
how-many
、delete-duplicate-lines
存在していませんでした。英語の単語をハイフンでつなぐだけで、Emacsが何をすべきか知っているように見えることもあります。の組み込みEmacsバージョンuniq
もあると思いますが、見つかりませんでした。
uniq
では-c
カウントを前に付けるオプションがあり、を使用する前にソートする必要はないと思いますuniq
。(また、OPはバッファ全体ではなく、リージョンの処理を要求しました。)