it-swarm.com.de

Entfernen Sie den gesamten Text vor dem Doppelpunkt

Ich habe eine Datei mit einer bestimmten Anzahl von Zeilen. Jede Zeile sieht folgendermaßen aus:

TF_list_to_test10004/Nus_k0.345_t0.1_e0.1.adj:PKMYT1

Ich möchte alle Zeichen vor dem Zeichen ":" entfernen, um nur PKMYT1 zu erhalten, bei dem es sich um einen Gennamen handelt. Da ich kein Experte für Regex-Scripting bin, kann mir jemand mit Unix (sed oder awk) oder in R helfen?

36
Elb

Es gibt zwei Möglichkeiten, dies in R zu tun:

foo <- "TF_list_to_test10004/Nus_k0.345_t0.1_e0.1.adj:PKMYT1"

# Remove all before and up to ":":
gsub(".*:","",foo)

# Extract everything behind ":":
regmatches(foo,gregexpr("(?<=:).*",foo,Perl=TRUE))
53
Sacha Epskamp

Ein einfacher regulärer Ausdruck, der mit gsub() verwendet wird:

x <- "TF_list_to_test10004/Nus_k0.345_t0.1_e0.1.adj:PKMYT1"
gsub(".*:", "", x)
"PKMYT1"

Weitere Informationen finden Sie unter ?regex oder ?gsub.

10
Andrie

Es gibt sicherlich mehr als zwei Möglichkeiten in R. Hier ist eine andere.

unlist(lapply(strsplit(foo, ':', fixed = TRUE), '[', 2))

Wenn der String eine konstante Länge hat, stelle ich mir vor, dass substr schneller als diese oder reguläre Methoden wäre.

9
John

Mit sed:

sed 's/.*://' < your_input_file > output_file

Dadurch wird alles ersetzt, dem ein Doppelpunkt durch nichts ersetzt wird. Daher wird alles bis einschließlich des letzten Doppelpunkts in jeder Zeile entfernt ( weil * standardmäßig gierig ).

Laut Josh O'Briens Kommentar: Wenn Sie nur bis zum ersten Doppelpunkt ersetzen möchten, tun Sie Folgendes:

sed "s/[^:]*://"

Dies wird mit allem übereinstimmen, das kein Doppelpunkt ist, gefolgt von einem Doppelpunkt und durch nichts ersetzt.

Beachten Sie, dass sie für beide Muster beim ersten Treffer in jeder Zeile aufhören. Wenn Sie eine Ersetzung für jede Übereinstimmung in einer Zeile durchführen möchten, fügen Sie am Ende des Befehls die Option 'g' (global) hinzu.

Beachten Sie auch, dass Sie unter Linux (aber nicht unter OSX) eine Datei direkt mit -i bearbeiten können, z. B .:

sed -i 's/.*://' your_file
8
John Carter

Sie können awk folgendermaßen verwenden:

awk -F: '{print $2}' /your/file
5
Costi Ciudatu

Wenn Sie GNU coreutils verfügbar haben, verwenden Sie cut:

cut -d: -f2 infile
2
Thor

Ich habe an einem ähnlichen Thema gearbeitet. Johns und Josh O'Briens Ratschlag hat es geschafft. Ich habe mit diesem tibble angefangen: 

library(dplyr)
my_tibble <- tibble(Col1=c("ABC:Content","BCDE:MoreContent","FG:Conent:with:colons"))

Es sieht aus wie:

  | Col1 
1 | ABC:Content 
2 | BCDE:MoreContent 
3 | FG:Content:with:colons

Ich musste dieses Tibbeln erstellen:

  | Col1                  | Col2 | Col3 
1 | ABC:Content           | ABC  | Content 
2 | BCDE:MoreContent      | BCDE | MoreContent 
3 | FG:Content:with:colons| FG   | Content:with:colons

Und das mit diesem Code (R-Version 3.4.2).

my_tibble2 <- mutate(my_tibble
        ,Col2 = unlist(lapply(strsplit(Col1, ':',fixed = TRUE), '[', 1))
        ,Col3 = gsub("^[^:]*:", "", Col1))
1
Leslie Sage

Nachfolgend finden Sie 2 gleichwertige Lösungen:

Die erste verwendet die -a autosplit-Funktion von Perl, um jede Zeile mit : in Felder aufzuteilen, das Feld F fields aufzufüllen und das zweite Feld $F[1] zu drucken (ab Feld 0 gezählt)

Perl -F: -lane 'print $F[1]' file

Der zweite verwendet einen regulären Ausdruck, um s/// von ^ den Zeilenanfang, .*: alle Zeichen zu ersetzen, die mit einem Doppelpunkt enden, und nichts

Perl -pe 's/^.*://' file
0
Chris Koknat

Einige sehr einfache Schritte, die mir bei der besten Antwort von @Sacha Epskamp entgangen sind, bestand darin, die Unterfunktion zu verwenden, in diesem Fall, um alles vor dem ":" zu nehmen (anstatt es zu entfernen), also war es sehr einfach:

foo <- "TF_list_to_test10004/Nus_k0.345_t0.1_e0.1.adj:PKMYT1"

# 1st, as she did to remove all before and up to ":":
gsub(".*:","",foo)

# 2nd, to keep everything before and up to ":": 
gsub(":.*","",foo)

Im Grunde dasselbe, ändern Sie einfach die Position ":" im Unterargument. Ich hoffe es wird helfen.