shufは入力行をシャッフルして出力するコマンドです。
【 shuf 】コマンド――入力行をシャッフルして出力する:Linux基本コマンドTips(112) - @IT
このshufに -n
オプションを追加すると出力する行数を指定できます。これにより、たとえば「ピークファイル(BED)からランダムにn行抽出する」ことが極めて簡単にできます。
ピークのダウンロード
$ wget http://hgdownload.soe.ucsc.edu/goldenPath/hg19/encodeDCC/wgEncodeAwgTfbsUniform/wgEncodeAwgTfbsSydhH1hescCjunIggrabUniPk.narrowPeak.gz $ gunzip wgEncodeAwgTfbsSydhH1hescCjunIggrabUniPk.narrowPeak.gz # 内容の表示 $ head wgEncodeAwgTfbsSydhH1hescCjunIggrabUniPk.narrowPeak chr10 80917404 80917527 . 957 . 149.808548515806 -1 1.78532983501005 57 chr22 39570815 39571059 . 910 . 142.528642559654 -1 1.78532983501005 122 chr18 9643685 9643754 . 849 . 133.01812851997 -1 1.78532983501005 55 chr6 20811494 20811738 . 847 . 132.721884288658 -1 1.78532983501005 122 chr8 103918617 103918861 . 784 . 122.843985314485 -1 1.78532983501005 122 chr3 13692098 13692342 . 768 . 120.292626372352 -1 1.78532983501005 122 chr1 205263766 205264010 . 746 . 116.906226943541 -1 1.78532983501005 122 chr3 58035007 58035251 . 701 . 109.733323372861 -1 1.78532983501005 122 chr17 73781085 73781329 . 694 . 108.721733687985 -1 1.78532983501005 122 chr19 3968693 3968937 . 680 . 106.565969826384 -1 1.78532983501005 122
ピークファイルからランダムに100ピークを抽出
$ shuf -n 100 wgEncodeAwgTfbsSydhH1hescCjunIggrabUniPk.narrowPeak > wgEncodeAwgTfbsSydhH1hescCjunIggrabUniPk.random100.narrowPeak $ head wgEncodeAwgTfbsSydhH1hescCjunIggrabUniPk.random100.narrowPeak chr19 46009794 46010038 . 140 . 21.9338179870502 -1 1.26616002142041 122 chr12 120242198 120242442 . 172 . 27.0065867360251 -1 1.33845649360463 122 chr3 185525441 185525685 . 131 . 20.6569949210623 -1 1.24621711968293 122 chr18 9643685 9643754 . 849 . 133.01812851997 -1 1.78532983501005 55 chr1 227750961 227751205 . 245 . 38.399370869934 -1 1.48650376307134 122 chr1 22379061 22379305 . 122 . 19.1627516856611 -1 1.24017410861089 122 chr19 47744334 47744578 . 203 . 31.8083079397841 -1 1.46637326118701 122 chr2 28114000 28114244 . 168 . 26.3872013177204 -1 1.33277877166033 122 chr4 113668168 113668412 . 114 . 17.9214793015699 -1 1.21539561863277 122 chr8 145133349 145133593 . 188 . 29.5813341454769 -1 1.42910033502578 122
ランダム抽出なので、実行するたびに結果は変わります。なので皆さんが試した場合、headで表示されるものはこれとは違うものになるでしょう。
これでpermutation testがやりやすくなりますね!
余談
ちなみに私がこのshufコマンドを知ったのはごく最近で、それまでは以下のような自作のperlスクリプトを使っていました。
#!/usr/bin/env perl use strict; use warnings; use autodie; die "random_pickup.pl <file> <p>\n" if($#ARGV !=1); my $file=$ARGV[0]; my $p=$ARGV[1]; open(File, $file) || die "error: can't open $file.\n"; while(my $line = <File>){ $x = rand(); if($x < $p){ print $line; } } close (File);
これは確率pで各行を出力するというものです。これだと出力行数を明示的に指定できないという難点がありましたが、shufコマンドならば楽にできますね。 一方でfastqやsamファイルなど、単純なn行抽出では実行できないファイルをsubsampleしたい時は未だにperlを使っています。