删除冒号前的所有文本

时间:2012-09-06 10:17:51

标签: r unix replace sed awk

我有一个包含一定数量行的文件。每一行都是这样的:

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

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

9 个答案:

答案 0 :(得分:53)

以下是在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))

答案 1 :(得分:10)

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

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

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

答案 2 :(得分:9)

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

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

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

答案 3 :(得分:8)

使用sed:

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

这将替换任何后跟冒号的内容,因此它将删除所有内容,包括每行(because * is greedy by default)上的最后一个冒号。

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

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

这将匹配任何非冒号,后跟一个冒号,并替换为空。

请注意,对于这两种模式,它们将在每一行的第一场比赛中停止。如果要对一行中的每个匹配进行替换,请将'g' (global)选项添加到命令的末尾。

另请注意,在linux上(但不在OSX上),您可以使用-i就地编辑文件,例如:

sed -i 's/.*://' your_file

答案 4 :(得分:5)

您可以像这样使用awk

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

答案 5 :(得分:2)

如果你有GNU coreutils可用,请使用cut

cut -d: -f2 infile

答案 6 :(得分:1)

我正在研究类似的问题。 John和Josh O&Brien's的建议奏效了。我开始使用这个步骤:

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

我需要创建这个tibble:

  | 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))

答案 7 :(得分:0)

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

第一个使用perl的NULL自动分割功能,使用-a将每一行拆分为字段,填充:字段数组,然后打印第二个字段F(计数开始)来自字段0)

$F[1]

第二个使用正则表达式从perl -F: -lane 'print $F[1]' file 替换s///行的开头,^任何以冒号结尾的字符,没有.*:

答案 8 :(得分:0)

我从最好的回应中错过了一些非常简单的举动@Sacha Epskamp是使用子功能,在这种情况下将所有内容都带到&#34;:&#34;(而不是删除它),所以它非常简单:

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)

基本上,同样的事情,只需改变&#34;:&#34;在sub参数内的位置。希望它会有所帮助。