Palmsonntagmorgen

NGSデータを使った解析と、その周辺。

shuf: テキストファイルの行をランダム抽出

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を使っています。