2017-07-10 9 views
0

zu formatieren Ich verwende sed, um aus einer großen Datei zu extrahieren. Die untenstehende scheint die Daten im unten stehenden Format zu extrahieren und von dort bin ich mir nicht sicher, wie ich die Datei säubern soll, um die gewünschte Ausgabe zu sehen. Es gibt wahrscheinlich einen besseren Weg, ich bin mir einfach nicht sicher, wie. Vielen Dank :).sed, um extrahierten Text in Datei

  1. jede führende Symbol (oder: oder;) entfernt wird, wenn es sich um Text in $2
  2. alle Kommata in $3 sind conveted zu ;
  3. $3 hat den weißen Raum vor der Text
  4. entfernt vorausgeht
  5. gibt es 3 tabula~~POS=TRUNC delimeted Felder in der Ausgabe

Datei Leerzeichen getrennte

81201 APC gene analysis; full gene sequence 
81210 BRAF , gene analysis, full gene sequence, V600 variant 

gewünschte Ausgangs getabulatortrennte

81201 APC gene analysis;full gene sequence 
81210 BRAF gene analysis;full gene sequence;V600 variant 

Sed

sed -e 's/([^()]*)//g' file.txt | sed '$!N;s/\n/ /' > file 

Originaldatei

81201 APC (adenomatous polyposis coli) (eg, familial adenomatosis 
polyposis [FAP], attenuated FAP) gene 
analysis; full gene sequence 
81210 BRAF (B-Raf proto-oncogene, serine/threonine kinase) (eg, colon 
cancer), gene analysis, V600 variant(s) 
+1

Was sind '$ 2' und' $ 3' in Ihrer Beschreibung? Was soll 's/([^()] *) // g'' in deinen eigenen Worten tun? –

+1

Sind Sie sicher, dass Sie diesen Klammern nicht entgehen möchten? –

+0

'$ 2' ist' APC' und 'BRAF' ....' $ 3' ist 'Genanalyse; vollständige Gensequenz "in Zeile 1 und", Genanalyse, vollständige Gensequenz, V600-Variante "in Zeile 3 ....Beim Erstellen dieser 'Datei' verwende ich' sed -e 's/([^()] *) // g'', um die Klammer zu entfernen und sie dann zu einem 'sed' zu leiten, das alle zwei Zeilen kombiniert. Ich werde die ursprüngliche Datei dem Beitrag hinzufügen. Vielen Dank :). – Chris

Antwort

1

Ich bin mir nicht sicher, ob die gezeigten Befehle wie erwartet funktionieren, aber da dies nicht Teil Ihrer Frage ist, werde ich sie ignorieren.

Hier ist ein Weg, um die endgültige Bereinigung mit ein paar relativ einfache Ausdrücke zu tun:

 
sed -e 's/^\s*\([^ \t]\+\)\s\+\([^ \t]\+\)\s\+[,;]\?\s*\(.*\)/\1\t\2\t\3/' \ 
    -e 's/[,;]\s*/;/g' 

Der erste Ausdruck erfasst nur die Teile, die Sie wollen: keine zusätzlichen Leerzeichen oder Komma. Die fettgedruckten Abschnitte stellen die Fanggruppen dar, die beibehalten werden. Der zweite Teil ersetzt alle Kommas durch Semikolons, da zu dem Zeitpunkt, an dem der Ausdruck angewendet wird, keine Kommas außerhalb des dritten Feldes stehen sollten. Beachten Sie, dass sed immer gierige Quantoren verwendet, so dass das Whitespace-Problem von \s\+ korrekt behandelt wird.

Abhängig von Ihrer Version von sed müssen Sie möglicherweise mit der Escape-Funktion ein wenig spielen. Möglicherweise müssen Sie auch \s durch [ \t] ersetzen.

Eingang

81201 APC gene analysis; full gene sequence 
81210 BRAF , gene analysis, full gene sequence, V600 variant 

Ausgabe

81201 APC  gene analysis;full gene sequence 
81210 BRAF gene analysis;full gene sequence;V600 variant 
+0

Vielen Dank für die Hilfe und Erklärung :) – Chris

+0

Kein Problem. Ich bin froh, dass es für dich geklappt hat. –

Verwandte Themen