2016-03-23 5 views
3

フラットファイル(.txt)が606,347 カラムであり、サンプル識別である最初のカラムを除いて50,000個のランダムカラムを抽出したいとします。 Linuxのコマンドを使ってどうすればいいですか? ファイルは次のようになります。linuxコマンドを使用したカラムのランダムな選択

ID SNP1 SNP2 SNP3 
1 0 0 2 
2 1 0 2 
3 2 0 1 
4 1 1 2 
5 2 1 0 

TABで区切られています。

ありがとうございました。

乾杯、

Paula。

+1

for(i=1;i<=k;i++)を変更ですか平均*列*または*行*? – hek2mgl

+0

私は列を意味します。 – PaulaF

+0

いくつかのサンプルデータを提供できますか? – hek2mgl

答えて

2

awk!あなたは$ 1印刷し、2

すなわちから機能ループを開始することができ、あなたの特別な場合で

$ cat shuffle.awk 

    function shuffle(a,n,k) { 
    for(i=1;i<=k;i++) { 
     j=int(rand()*(n-i))+i 
     if(j in a) a[i]=a[j] 
     else a[i]=j 
     a[j]=i; 
    } 
    } 

    BEGIN{srand(); shuffle(ar,NF,ncols)} 
     {for(i=1;i<=ncols;i++) printf "%s", $(ar[i]) FS; print ""} 

一般的な使用

$ echo $(seq 5) | awk -f shuffle.awk -v ncols=5 
3 4 1 5 2 

a[1]=1; for(i=2;i<=k;i++)

+0

良い答え。これを「より良い」ランダム性にチェックしてください:http://stackoverflow.com/a/4048538/171318 – hek2mgl

+0

はい、良い点ですが、600kを超えるカラムを実行するのに時間がかかるのでこのケースに当てはまるとは確信していません。このような記録的な構造を持つのは誰ですか? – karakfa

+0

@karakfaありがとうございました。それは私のために働いています。唯一の問題は、カラム1を他のカラムから分離できないためです。最初の列として印刷し、ランダムな選択には含めないようにするにはどうすればよいですか?申し訳ありませんが、私はUnixコマンドの初心者です。 – PaulaF

2

はこれを試してみてください:

echo {2..606347} | tr ' ' '\n' | shuf | head -n 50000 | xargs -d '\n' | tr ' ' ',' | xargs -I {} cut -d $'\t' -f {} file 

更新:救助へ

echo {2..606347} | tr ' ' '\n' | shuf | head -n 50000 | sed 's/.*/&p/' | sed -nf - <(tr '\t' '\n' <file) | tr '\n' '\t' 
+0

このエラーが発生します:xargs:引数リストが長すぎます。私が変更できるものはありますか?ありがとう。 :) – PaulaF

+1

私は私の答えを更新しました。 – Cyrus

関連する問題