59

我有一个包含一定数量行的文件。每行如下所示:

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

我想删除“:”之前的所有字符,以便仅保留作为基因名称的 PKMYT1。由于我不是正则表达式脚本专家,任何人都可以帮助我使用 Unix(sed 或 awk)或在 R 中执行此操作吗?

4

10 回答 10

96

以下是在 R 中执行此操作的两种方法:

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))
于 2012-09-06T10:23:14.077 回答
19

与 一起使用的简单正则表达式gsub()

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

请参阅?regex?gsub获取更多帮助。

于 2012-09-06T10:22:40.413 回答
10

使用 sed:

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

这将替换后跟冒号的任何内容,因此它将删除所有内容,包括每行最后一个冒号(因为*默认情况下是贪婪的)。

根据 Josh O'Brien 的评论,如果您只想替换第一个冒号(包括第一个冒号),请执行以下操作:

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

这将匹配任何不是冒号的内容,后跟一个冒号,然后什么都不替换。

请注意,对于这两种模式,它们都会在每行的第一个匹配项上停止。如果您想对一行中的每个匹配项进行替换,请将g”(全局)选项添加到命令的末尾。

另请注意,在 linux(但不是 OSX)上,您可以使用以下命令就地编辑文件-i

sed -i 's/.*://' your_file
于 2012-09-06T10:26:46.400 回答
10

R中肯定有两种以上的方式。这是另一种方式。

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

如果字符串具有恒定长度,我想substr会比这个或正则表达式方法更快。

于 2012-09-06T11:59:59.813 回答
6

你可以awk这样使用:

awk -F: '{print $2}' /your/file
于 2012-09-06T10:31:50.777 回答
5

使用包str_remove中的解决方案stringr

str_remove("TF_list_to_test10004/Nus_k0.345_t0.1_e0.1.adj:PKMYT1", ".*:")
[1] "PKMYT1"
于 2021-08-13T07:49:15.553 回答
3

我从最佳响应@Sacha Epskamp 中错过的一些非常简单的举动是使用 sub 函数,在这种情况下,取“:”之前的所有内容(而不是删除它),所以它非常简单:

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)

基本上,同样的事情,只需更改子参数内的“:”位置。希望它会有所帮助。

于 2018-01-04T17:45:07.947 回答
2

如果您有 GNUcoreutils可用,请使用cut

cut -d: -f2 infile
于 2012-09-06T12:49:01.030 回答
2

我正在研究类似的问题。John 和 Josh O'Brien 的建议起到了作用。我从这个小标题开始:

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

看起来像:

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

我需要创建这个小标题:

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

并使用此代码(R 版本 3.4.2)这样做。

my_tibble2 <- mutate(my_tibble
        ,Col2 = unlist(lapply(strsplit(Col1, ':',fixed = TRUE), '[', 1))
        ,Col3 = gsub("^[^:]*:", "", Col1))
于 2017-11-30T23:32:21.110 回答
0

以下是2个等效解决方案:

第一个使用 perl 的-a自动拆分功能将每一行拆分为使用:的字段,填充F字段数组,并打印第二个字段$F[1](从字段 0 开始计数)

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

第二个使用正则表达式s///^行首替换.*:任何以冒号结尾的字符,什么都没有

perl -pe 's/^.*://' file
于 2015-10-09T17:59:48.320 回答