アメリエフの技術ブログ

Amelieff Staff Blog

sedコマンドで染色体名を変更する方法

はいどーも皆さんこんにちは、adachitです。

以前、bedtoolsを使って、2つのファイルの共通領域を書き出そうとしたところ、染色体名が異なるためエラーが出力されました。   ファイルによって、接頭に「chr」が付いていたり付いていなかったりとバラバラです。
こういう場合、Linuxのsedコマンドを使用することで染色体の名前を変更することができます。 それでは、サンプルファイルを使用して実際にやってみます。

今回は、2つのサンプルファイル、1_test_sorted.bedと2_test_sorted.bedを用意しました。
それぞれのファイルの中身は以下のようになっています。

$ less 1_test_sorted.bed
chr1    5       20
chr1    25      30
chr1    45      50

$ less 2_test_sorted.bed   
1       10      15
1       25      30
1       100     200

ご覧のようにこれらの2つのファイルの染色体名は、異なっています。こちらに対して、bedtools intersectを実行すると

$ bedtools intersect -a 1_test_sorted.bed -b 2_test_sorted.bed > output.bed

***** WARNING: File 1_test_sorted.bed has inconsistent naming convention for record:
chr1    5   20

***** WARNING: File 1_test_sorted.bed has inconsistent naming convention for record:
chr1    5   20

このようなエラーが出力されます。
ここで、sedコマンドを使用し、b_sample_sorted.bedの接頭に「chr」を付与して、染色体名を揃えます。

$ sed 's/^/chr/' 2_test_sorted.bed > 2_test_sorted_chr.bed
$ less 2_test_sorted_chr.bed
chr1    10      15
chr1    25      30
chr1    100     200

各行の先頭に「chr」が付与されています。 それでは、このファイルを使ってbedtools intersectをやっていきます。

$ bedtools intersect -a 1_test_sorted.bed -b 2_test_sorted_chr.bed > output.bed 
$ less output.bed
chr1    10      15
chr1    25      30

エラーなくbedtoolsを実行できました!
今回は、sedコマンドで「chr」を付与しましたが、逆に1_test_sorted.bedから「chr」を削除することで染色体名を揃えることができます。
削除する場合のコマンドは以下の通りです。

$ sed 's/^chr//' 1_test_sorted.bed > 1_test_sorted_no_chr.bed  
$ less 1_test_sorted_no_chr.bed  
1       5       20
1       25      30
1       45      50

ぜひ機会があれば、お試しを。