アメリエフの技術ブログ

Amelieff Staff Blog

バイオインフォマティシャンでも、pecoがしたい!

 

先日、ついに日比谷線を利用しました、久保(kubor)です。
先日pecoが話題になっていた傍ら、社内ではなかなか広まらずに、寂しい思いをしているので、バイオインフォマティシャンにもおすすめの使い方を紹介いたします。

0. pecoってなに

標準入力で受け取ったテキストを、インクリメンタルサーチすることができるコマンドラインツールです。
更に、サーチ結果は、標準出力されます。

すなわち、テキストフィルタリング出力となります。

ちなみにpecoはpercolというソフトをGolangで書いたものです。
同様の機能を持つソフトとして、他にもzawなども有名ですが、数年前にpecoが高速だと話題になってからというもの、pecoの人気が突出しているように感じます。
以下が、各リポジトリです。

1. pecoのインストール

バイナリを落とすのが早いです。
以下からOSにあったものをダウンロードして、~/binディレクトリなどのPATHが通っているディレクトリにシンボリックリンクを作成します。

https://github.com/peco/peco/releases

2. 基本的な使い方

例えば、cat sample.txt | peco として、パイプでpecoを使えば、ウィンドウが開きsample.txtの中身をインクリメンタルサーチすることができます。
サーチ結果は、カーソルキーで選択することもできます。

これだけだとインクリメンタルサーチができるgrepですが、pecoの入出力をパイプすることで様々なことが可能になります。

3. スニペットを呼び出す

f:id:kubo-m:20190723200913g:plain

 

シンプルで、わかりやすい使い方として、スニペットをpecoで呼び出す方法を紹介します。zshを基準として書いていますので、bashの場合は適宜変更して関数を用意して下さい。

まず、解析によく使う便利コマンドや、ワンライナーをスニペットとして保存しておきます。
下記のように、ホームディレクトリにドットファイル(ファイル名の先頭にドットを入れると隠しファイルとなる)を作成するのがおすすめです。

~/.peco.snippet.bioinfo


#
# file: .peco.snippet.bioinfo
#

# grep
[remove header] grep -v "^#"
# perl
[print TSV header]perl -e 'for(split(/¥t/, )){$i++; print "$i $_¥n"}'
# samtools
[bam to sam] samtools view
[sam to bam] samtools view -bS
[sort bam] samtools sort
[make fasta index] samtools faidx
# sort
[sort BED file] sort -V -k1 -k2n


次に、.zshrcに以下を追記します。
保存後、`source ~/.zshrc`を実行した後、Ctrl+xと入力するとスニペットを選択する画面が起動します。

function peco-snippets-loader() {
if ls ~/.peco.snippet* >/dev/null 2>&1; then
snippet=`cat ~/.peco.snippet* | grep -v "^#" | peco`
BUFFER="$(echo $snippet | sed -e 's/^¥[.*¥] *//') "
CURSOR=$#BUFFER
else
echo "~/.peco.snippet* is not found."
fi
zle reset-prompt
}
zle -N peco-snippets-loader
if type peco >/dev/null 2>&1; then
bindkey '^x' peco-snippets-loader
fi

ポイントは`cat ~/.peco.snippet* | grep -v "^#" | peco`で、スニペットからコメント行(#から始まる行)を除外して、pecoに渡しています。
そして最後に選択したスニペット行頭の説明文をsedで取り除いています。

とっつきにくいですが使ってみると楽しいので、是非お試し下さい。
僕は、この他にもよく使うディレクトリへのショートカットや、ヒストリー検索をpecoで選択できるようにしています。