2016-03-23 8 views
3

Ich habe eine flache Datei (. Txt) mit 606.347 Spalten und ich möchte 50.000 RANDOM Spalten extrahieren, mit Ausnahme der ersten Spalte, die Probenidentifikation ist. Wie kann ich das mit Linux-Befehlen machen? Meine Datei sieht so aus:Zufällige Auswahl von Spalten mit Linux-Befehl

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

Es TAB begrenzt ist.

Vielen Dank.

Prost,

Paula.

+1

drucke meine * Spalten * oder * Zeilen *? – hek2mgl

+0

Ich meine Spalten. – PaulaF

+0

Können Sie einige Beispieldaten angeben? – hek2mgl

Antwort

2

awk zur Rettung!

$ 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 ""} 

allgemeine Nutzungs

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

in Ihrem speziellen Fall können Sie Sie $ 1 und starten Sie die Funktion Schleife von 2.

dh ändern

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

+0

Gute Antwort. Überprüfen Sie dieses für "bessere" Zufälligkeit: http://stackoverflow.com/a/4048538/171318 – hek2mgl

+0

Ja, guter Punkt, aber ich bin nicht sicher, dass es für diesen Fall gilt, da das Laufen für> 600k Spalten einige Zeit dauern wird. Wer kommt mit solchen Rekordstrukturen? – karakfa

+0

@karakfa vielen Dank. Das funktioniert für mich. Das einzige Problem ist, dass ich Spalte 1 nicht von den anderen trennen kann. Wie kann ich bitten, es als erste Spalte zu drucken und nicht in die Zufallsauswahl aufzunehmen? Tut mir leid, ich bin ein Anfänger für Unix-Befehle. – PaulaF

2

Versuchen Sie folgendes:

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

Update:

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

Ich bekomme diesen Fehler: Xargs: Argumentliste zu lang. Kann ich etwas ändern? Vielen Dank. :) – PaulaF

+1

Ich habe meine Antwort aktualisiert. – Cyrus

Verwandte Themen