2016-04-18 8 views
1

UPDATEWie selektiv Spalten und Zeilen mit bash oder Python

Ich vermute, zu entfernen, dass der Eingang und die gewünschte Ausgangsdaten Ich war zunächst in setzen nicht genau das gleiche wie ich, was ich in Bezug auf Leerzeichen haben. Ich habe jetzt neue Eingabedaten und gewünschte Ausgabedaten eingegeben.

Im Moment habe ich einen Datensatz, der wie folgt aussieht:

INPUT

Hybridization REF TCGA-13-A5FT-01A-11D-A409-05 TCGA-13-A5FT-01A-11D-A409-05 TCGA-13-A5FT-01A-11D-A409-05 TCGA-13-A5FT-01A-11D-A409-05 TCGA-13-A5FU-01A-11D-A409-05 TCGA-13-A5FU-01A-11D-A409-05 TCGA-13-A5FU-01A-11D-A409-05 TCGA-13-A5FU-01A-11D-A409-05 TCGA-29-A5NZ-01A-11D-A409-05 TCGA-29-A5NZ-01A-11D-A409-05 TCGA-29-A5NZ-01A-11D-A409-05 TCGA-29-A5NZ-01A-11D-A409-05 TCGA-3P-A9WA-01A-11D-A409-05 TCGA-3P-A9WA-01A-11D-A409-05 TCGA-3P-A9WA-01A-11D-A409-05 TCGA-3P-A9WA-01A-11D-A409-05 TCGA-59-A5PD-01A-11D-A409-05 TCGA-59-A5PD-01A-11D-A409-05 TCGA-59-A5PD-01A-11D-A409-05 TCGA-59-A5PD-01A-11D-A409-05 TCGA-5X-AA5U-01A-11D-A409-05 TCGA-5X-AA5U-01A-11D-A409-05 TCGA-5X-AA5U-01A-11D-A409-05 TCGA-5X-AA5U-01A-11D-A409-05 TCGA-OY-A56P-01A-12D-A409-05 TCGA-OY-A56P-01A-12D-A409-05 TCGA-OY-A56P-01A-12D-A409-05 TCGA-OY-A56P-01A-12D-A409-05 TCGA-OY-A56Q-01A-11D-A409-05 TCGA-OY-A56Q-01A-11D-A409-05 TCGA-OY-A56Q-01A-11D-A409-05 TCGA-OY-A56Q-01A-11D-A409-05 TCGA-VG-A8LO-01A-11D-A409-05 TCGA-VG-A8LO-01A-11D-A409-05 TCGA-VG-A8LO-01A-11D-A409-05 TCGA-VG-A8LO-01A-11D-A409-05 TCGA-WR-A838-01A-12D-A409-05 TCGA-WR-A838-01A-12D-A409-05 TCGA-WR-A838-01A-12D-A409-05 TCGA-WR-A838-01A-12D-A409-05 
Composite Element REF Beta_value Gene_Symbol Chromosome Genomic_Coordinate Beta_value Gene_Symbol Chromosome Genomic_Coordinate Beta_value Gene_Symbol Chromosome Genomic_Coordinate Beta_value Gene_Symbol Chromosome Genomic_Coordinate Beta_value Gene_Symbol Chromosome Genomic_Coordinate Beta_value Gene_Symbol Chromosome Genomic_Coordinate Beta_value Gene_Symbol Chromosome Genomic_Coordinate Beta_value Gene_Symbol Chromosome Genomic_Coordinate Beta_value Gene_Symbol Chromosome Genomic_Coordinate Beta_value Gene_Symbol Chromosome Genomic_Coordinate 
cg00000029 0.162232896986279 RBL2 16 53468112 0.191627667901702 RBL2 16 53468112 0.0712181967886229 RBL2 16 53468112 0.0797617926225958 RBL2 16 53468112 0.134907151266991 RBL2 16 53468112 0.0541415985613948 RBL2 16 53468112 0.0898579298345672 RBL2 16 53468112 0.037865566345129 RBL2 16 53468112 0.0681542463965581 RBL2 16 53468112 0.101053013486289 RBL2 16 53468112 
cg00000108 NA C3orf35 3 37459206 NA C3orf35 3 37459206 NA C3orf35 3 37459206 NA C3orf35 3 37459206 NA C3orf35 3 37459206 NA C3orf35 3 37459206 NA C3orf35 3 37459206 NA C3orf35 3 37459206 NA C3orf35 3 37459206 NA C3orf35 3 37459206 
cg00000109 NA FNDC3B 3 171916037 NA FNDC3B 3 171916037 NA FNDC3B 3 171916037 NA FNDC3B 3 171916037 NA FNDC3B 3 171916037 NA FNDC3B 3 171916037 NA FNDC3B 3 171916037 NA FNDC3B 3 171916037 NA FNDC3B 3 171916037 NA FNDC3B 3 171916037 

Der Datensatz ist viel größer und ist fast 10 GB groß. Zum Beispiel zu groß um in R zu tun.

Viele der Spalten sind jedoch effektiv Duplikate. Zum Beispiel muss ich nur jeweils eine der Spalten mit der Überschrift (zweite Zeile) Gene_Symbol, Chromosome und Genomic_Coordinate behalten. Die einzelnen Beta_value Spalten müssen bleiben, da sie für jede Probe unterschiedlich sind. Proben-IDs befinden sich in der ersten Zeile. So ein Beispiel gewünschte Ausgabe des obigen ist:

GEWÜNSCHTEN OUTPUT

Hybridization REF Gene_Symbol Chromosome Genomic_Coordinate TCGA-13-A5FT-01A-11D-A409-05 TCGA-13-A5FU-01A-11D-A409-05 TCGA-29-A5NZ-01A-11D-A409-05 TCGA-3P-A9WA-01A-11D-A409-05 TCGA-59-A5PD-01A-11D-A409-05 TCGA-5X-AA5U-01A-11D-A409-05 TCGA-OY-A56P-01A-12D-A409-05 TCGA-OY-A56Q-01A-11D-A409-05 TCGA-VG-A8LO-01A-11D-A409-05 TCGA-WR-A838-01A-12D-A409-05 
cg00000029 RBL2 16 53468112 0.162232897 0.191627668 0.071218197 0.079761793 0.134907151 0.054141599 0.08985793 0.037865566 0.068154246 0.101053013 
cg00000108 C3orf35 3 37459206 NA NA NA NA NA NA NA NA NA NA 
cg00000109 FNDC3B 3 171916037 NA NA NA NA NA NA NA NA NA NA 

beachte, dass ich die Spaltenüberschriften in der ersten Reihe haben gemischt redundante Informationen zu entfernen. Die mit TCGA... überschriebenen Spalten sind die Beispiel-IDs. Beachten Sie, dass eine harte Codierung der Spaltennummern nicht funktioniert, da ich mehrere Dateien durchlaufen muss, die alle eine variable Anzahl von Samples/Spalten haben.

Was ist die effizienteste Art, das mit bash oder mit Python zu tun?

EDIT:

Mit John Zwinck Antwort unten aber mit \t zwischen jedem %s ich jetzt erhalte die folgende Fehlermeldung:

+ NR == 1 '{' ../../../methods/meth_ma_gene/awk_methreformat.sh: line 3: NR: command not found ../../../methods/meth_ma_gene/awk_methreformat.sh: line 5: syntax error near unexpected token `(' ../../../methods/meth_ma_gene/awk_methreformat.sh: line 5: ` for (i=1; i <= NF; i++) {' 

ich das awk-Skript in einem Bash-Skript ausgeführt werden wie folgt :

#!/usr/bin/env bash 

for f in TCGAOV*; do 

    sed 's/Hybridization REF/Hybridization_REF/; s/Composite Element REF/Composite_Element_REF/' "$f" > "final.$f" 

    bash -x ./../../methods/meth_ma_gene/awk_methreformat.sh "final.$f" > "final.$f" 

done 

wo das referenzierte awk-Skript ist:

#!/usr/bin/awk -f                                        
NR == 1 { 
    # collect sample names                                        
    for (i=1; i <= NF; i++) { 
     sample[i] = $i 
    } 
} 

NR == 2 { 
    # first four columns are always the same                                    
    cols[1] = 1 
    cols[2] = 3 
    cols[3] = 4 
    cols[4] = 5 
    printf "%s\t%s\t%s\t%s\t", sample[1], $3, $4, $5 

    # dynamic columns (in practice: 2,6,10,...)                                   
    for (i=1; i <= NF; i++) { 
     if ($i == "Beta_value") { 
      cols[length(cols)+1] = i 
      printf "%s\t", sample[i] 
     } 
    } 
    printf "\n" 
} 

NR >= 3 { 
    # print cols from data row                                       
    for (i=1; i <= length(cols); i++) { 
     printf "%s\t", $cols[i] 
    } 
    printf "\n" 
} 

Ich denke, das kann etwas mit dem Abstand zwischen den Feldern zu tun haben. Beachten Sie, dass ich habe auch die Eingabe über geändert, da ich verpasst, dass es eigentlich keine _ zwischen den Worten Hybridization REF bilden und denen auch Composite Element REF

+0

Da Sie Python in der Frage enthalten, haben Sie versucht, Pandas mit? –

+0

Nein, soll ich? Ich habe es gerade jetzt nachgeschlagen und es scheint, dass Pandas bietet Datenanalyse-Funktionalität, anstatt Datenformatierung – user3313178

+2

Es kann im Allgemeinen nützlich sein für große Matrix-Manipulationen. Datenbereinigung ist eine Teilmenge der Datenanalyse –

Antwort

1

Sie bilden wirklich nicht, die Eingangsdaten in den Speicher geladen werden soll, weil es so groß ist. Stattdessen wird ein Streaming-Ansatz schneller, und für diese awk ist gut geeignet:

#!/usr/bin/awk -f 

BEGIN { 
    FS = "\t"; 
    OFS = FS; 
} 

NR == 1 { 
    # collect sample names                                        
    for (i=1; i <= NF; i++) { 
     sample[i] = $i 
    } 
} 

NR == 2 { 
    # first four columns are always the same                                    
    cols[1] = 1 
    cols[2] = 3 
    cols[3] = 4 
    cols[4] = 5 
    printf "%s %s %s %s ", sample[1], $3, $4, $5 

    # dynamic columns (in practice: 2,6,10,...)                                   
    for (i=1; i <= NF; i++) { 
     if ($i == "Beta_value") { 
      cols[length(cols)+1] = i 
      printf "%s ", sample[i] 
     } 
    } 
    printf "\n" 
} 

NR >= 3 { 
    # print cols from data row                                       
    for (i=1; i <= length(cols); i++) { 
     printf "%s ", $cols[i] 
    } 
    printf "\n" 
} 

Dies ergibt die gewünschte Ausgabe. Wenn Sie mehr Geschwindigkeit wünschen, sollten Sie awk verwenden, um einfach die Spaltennummern zu drucken (die nur die beiden Kopfzeilen lesen müssen) und dann , um sie tatsächlich zu drucken.Dies wird schneller, da kein interpretierter Code für jede Datenzeile ausgeführt werden muss. Für die Beispieldaten in der Frage, die cut Befehl, den Sie benötigen, um alle Datenzeilen zu drucken, ist so etwas wie dieses:

cut -d '\t' -f 1,3,4,5,2,6 
+0

Sieht gut aus, aber wenn ich das Skript ausführen und die Daten ausgeben, ist es nicht tab-formatiert. Was würde mir erlauben, das im obigen Code zu tun? Ich kann nicht sagen, dass ich viel davon verstehe, aber ich werde es in Stücke zerlegen und versuchen zu verstehen, – user3313178

+0

@ user3313178: Wenn Sie Tabs wollen, ändern Sie einfach z. 'printf"% s "' bis 'printf"% s \ t "'. –

+0

Ich finde, dass die Verwendung des obigen Codes mir eine leere Seite gibt. Ein möglicher Grund ist, dass viele der Dateien, die ich habe, "Hybridization REF" anstelle von "Hybridization_REF" sind. Ebenso "Composite Element REF" anstelle von "Composite_Element_REF". Keiner der anderen Spaltenüberschriften unterscheidet sich. Was könnte das Problem hier sein? – user3313178

Verwandte Themen