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?
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))
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
.
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.
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
Sie können awk
folgendermaßen verwenden:
awk -F: '{print $2}' /your/file
Wenn Sie GNU coreutils
verfügbar haben, verwenden Sie cut
:
cut -d: -f2 infile
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))
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
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.