横方向のcat

RSEMの結果ファイルからFPKM値で複数のサンプルの結果を抜き出したいとき。current directoryすべての結果ファイルに対してそれをしたい場合、以下のようなシェルスクリプトで。実行する前にFPKMというdirectoryを作成して、そこに処理したファイル群が書き込まれるようにする。

1
2
3
4
5
6
#!/bin/sh
mkdir FPKM
for f in *.genes.results;
 do echo $f > FPKM/$f
 cut -f7 $f >> FPKM/$f
done

RSEMの結果ではFPKM値は左から7番目のカラムに書き込まれているからそれをcut -f7で抜き出すようにする。 これらの結果だけではFPKM値のみで、遺伝子名とかの情報が入らなくなるので、左に来るべきファイルを以下のようなコマンドであらかじめ作っておく。

1
2
#!/bin/sh
cut -f1,2,3,4 hoge.genes.results > FPKM/lefter.txt

ここで注意しないといけないのは、抜き出したFPKM値はファイル名を1行追加してしまったために、lefter.txtと長さがちがっていること。

1
2
3
#!/bin/sh
cd FPKM
wc -l *

してみるとそれが明らかになる。なので、lefter.txtを編集して1行目と2行目の間に新たに行を1行挿入しておく必要がある。以下の例では別のファイルlefter2.txtとして示す。そうしてからそれらのファイルを横方向のcatコマンドというべきpasteコマンドを使って連結する。

1
2
#!/bin/sh
paste lefter2.txt *.genes.results > all.txt

ファイルの行数が一緒でないとデータの対応がおかしくなるので要注意である。ファイルを連結したあとで、2行目は不要になるので、その部分一行削除しておくと良かろう。

仕上げにフィアル名についている.genes.resultsをいう文字列を一括で削除するにはPerlのワンライナーで。

1
2
#!/bin/sh
perl -i~ -pe 's/.genes.results//g' all.txt

Written by bonohu in misc on 月 03 7月 2017.