2016-04-07 25 views
1

Ich möchte bestimmte Spalten aus einer Datei basierend auf dem Header-Namen extrahieren. Einige der Namen haben Leerzeichen (die Datei ist tabulatorgetrennt). Ich kann die Leerzeichen nicht entfernen oder ersetzen, da nachfolgende Anwendungen betroffen sind. Was ich suche ist eine Spalte auf Header-Namen und geben sie in der Reihenfolge, zu extrahieren Ich wünscheprint Certains Spalten nach Header-Namen mit Leerzeichen (awk, sed)

Hier ist ein Beispiel für meine Datei:

Sample Note Intragenic Rate ABCDE_177447 
1032 NA 0.97867626 0.9300704670625763 0.72782564 
ABCDE_177447 NA 0.97836965 1.0 0.87218356 
ABCDE_188399 NA 0.97859967 0.905527730405171 0.81188565 
ABCDE_189595 NA 0.9787659 0.9059075892313707 0.8089241 
ABCDE_189596 NA 0.9788054 0.9065243881070291 0.8092951 

Mein gewünschten Ausgang;

Sample Intragenic ABCDE_177447 
1032 0.97867626 0.9300704670625763 0.72782564 
ABCDE_177447 0.97836965 0.87218356 
ABCDE_188399 0.97859967 0.81188565 
ABCDE_189595 0.9787659 0.8089241 
ABCDE_189596 0.9788054 0.8092951 

Ich habe diese Lösung AWK extract columns from file based on header selected from 2nd file

versucht, aber es für diese Lösung nicht Extracting columns from a file

mit Leerzeichen auf Namen und die gleiche Arbeit habe ich diese

$cat cols.awk 

BEGIN { 
n=split(cols,col) 
for (i=1; i<=n; i++) s[col[i]]=i 
} 
NR==1 { 
for (f=1; f<=NF; f++) 
    if ($f in s) c[s[$f]]=f 
next 
} 
{ sep="" 
for (f=1; f<=n; f++) { 
    printf("%c%s",sep,$c[f]) 
    sep=FS 
} 
print "" 
} 

auch versucht, Aber als ich mein Skript wie awk -F\t -f cols.awk.sh -v cols="Note,Sample,Intragenic Rate" metrics.txt lief, bekam ich den folgenden Fehler:

awk: illegal field $(), name "1" 
input record number 2, file metrics.txt 
source line number 12 

Antwort

1

können Sie diese awk verwenden:

awk -v cols='Sample,Intragenic,ABCDE_177447' 'BEGIN{FS=OFS="\t"; nc=split(cols, a, ",")} NR==1{for (i=1; i<=NF; i++) hdr[$i]=i} {for (i=1; i<=nc; i++) if (a[i] in hdr) printf "%s%s", $hdr[a[i]], (i<nc?OFS:ORS)}' file 

Sample Intragenic ABCDE_177447 
1032 0.97867626 0.72782564 
ABCDE_177447 0.97836965 0.87218356 
ABCDE_188399 0.97859967 0.81188565 
ABCDE_189595 0.9787659 0.8089241 
ABCDE_189596 0.9788054 0.8092951 

cols Befehlszeilenargumente verwenden Sie können eine durch Kommata getrennte Liste von Spalten passieren zu drucken.

ist hier besser lesbar awk:

awk -v cols='Sample,Intragenic,ABCDE_177447' 'BEGIN { 
    FS=OFS="\t" 
    nc=split(cols, a, ",") 
} 
NR==1 { 
    for (i=1; i<=NF; i++) 
     hdr[$i]=i 
} 
{ 
    for (i=1; i<=nc; i++) 
     if (a[i] in hdr) 
     printf "%s%s", $hdr[a[i]], (i<nc?OFS:ORS) 
}' file 
+0

dank @anubhava, könnten Sie mir sagen, wie es zu tun für einschließlich Befehlszeilenargumente wie yourfile.sh "Cols1, cols 2" Eingabedatei? – user2380782

+0

Innerhalb 'yourfile.sh' können Sie diesen awk-Befehl speichern:' awk -v cols = "$ 1" 'BEGIN {FS = OFS = "\ t"; nc = split (spalten, a, ",")} NR == 1 {für (i = 1; i <= NF; i ++) hdr [$ i] = i} {für (i = 1; i <= nc ; i ++) wenn (a [i] in hdr) printf "% s% s", $ hdr [a [i]], (i anubhava

+1

vielen Dank @anubhava – user2380782

0
awk '{sub(/Note Intragenic Rate/,"Intragenic")}{sub(/NA/, "")}NR>2{sub($3, "")}1' file 

Sample Intragenic ABCDE_177447 
1032 0.97867626 0.9300704670625763 0.72782564 
ABCDE_177447 0.97836965 0.87218356 
ABCDE_188399 0.97859967 0.81188565 
ABCDE_189595 0.9787659 0.8089241 
ABCDE_189596 0.9788054 0.8092951 
Verwandte Themen