2017-01-18 2 views
-1

Das folgende ist die Zeile, die ich es auf Registerkarte separaten Teil teilen wollte.Brauchen Sie Hilfe beim Formatieren einer Linie mit sed

>VFG000676(gb|AAD32411)_(lef)_anthrax_toxin_lethal_factor_precursor_[Anthrax_toxin_(VF0142)]_[Bacillus_anthracis_str._Sterne] 

die Ausgabe, die ich will, ist

>VFG000676\t(gb|AAD32411)\t(lef)\tanthrax_toxin_lethal_factor_precursor\t [Anthrax_toxin_(VF0142)]\t[Bacillus_anthracis_str._Sterne] 

ich diesen Befehl

grep '>' x.fa | sed 's/^>\(.*\) (gi.*) \(.*\) \[\(.*\)\].*/\1\t\2\t\3/' | sed 's/ /_/g' > output.tsv 

aber die Ausgabe ist nicht das, was ich will.

UPDATE: Ich reparierte schließlich das Problem, indem Sie den folgenden Code

grep '>' VFs_no_block.fa | sed 's/^>\(.*\)\((.*)\) \((.*)\) \(.*\) \(\[.*(.*)]\) \(\[.*]\).*/\1\t\2\t\3\t\4\t\5\t\6/' | sed 's/ /_/g' > VFDB_annotation_reference.tsv 
+0

fügen Sie bitte eine kurze Beschreibung als Titel (enthält mehr Informationen als nur die [tag] s) –

+0

und können Sie (auch) beschreiben (in Worten), wie Sie die Eingabezeichenfolge teilen wollen? –

Antwort

1

ändern OFS="\\t"-OFS="\t" wenn Sie wirklich wörtlich Tabs wollten mit:

$ cat tst.awk 
BEGIN { OFS="\\t" } 
{ 
    c=0 
    while (match($0,/\[[^][]+\]|\([^)(]+\)|[^][)(]+/)) { 
     tgt = substr($0,RSTART,RLENGTH) 
     gsub(/^_+|_+$/,"",tgt) 
     if (tgt != "") { 
      printf "%s%s", (c++ ? OFS : ""), tgt 
     } 
     $0 = substr($0,RSTART+RLENGTH) 
    } 
    print 
} 

$ awk -f tst.awk file 
>VFG000676\t(gb|AAD32411)\t(lef)\tanthrax_toxin_lethal_factor_precursor\t[Anthrax_toxin_(VF0142)]\t[Bacillus_anthracis_str._Sterne] 
+0

Vielen Dank für die Antwort. – Mahdi

+0

Gern geschehen. Unter http://stackoverflow.com/help/someone-answers finden Sie weitere Informationen. –

Verwandte Themen