我有含有一定数目的行的文件。 每一行看起来是这样的:
TF_list_to_test10004/Nus_k0.345_t0.1_e0.1.adj:PKMYT1
我想所有之前删除“:”字符,以仅保留是基因名称的PKMYT1。 因为我不是在正则表达式脚本专家谁能帮助我做到这一点使用的Unix(SED或AWK)或R'
我有含有一定数目的行的文件。 每一行看起来是这样的:
TF_list_to_test10004/Nus_k0.345_t0.1_e0.1.adj:PKMYT1
我想所有之前删除“:”字符,以仅保留是基因名称的PKMYT1。 因为我不是在正则表达式脚本专家谁能帮助我做到这一点使用的Unix(SED或AWK)或R'
以下是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))
与使用简单的正则表达式gsub()
x <- "TF_list_to_test10004/Nus_k0.345_t0.1_e0.1.adj:PKMYT1"
gsub(".*:", "", x)
"PKMYT1"
见?regex
或?gsub
更多的帮助。
当然,还有在R.超过2种方式下面是另一个。
unlist(lapply(strsplit(foo, ':', fixed = TRUE), '[', 2))
如果字符串具有恒定的长度我想象substr
会比这或正则表达式的方法快。
使用SED:
sed 's/.*://' < your_input_file > output_file
这将取代任何东西,然后什么也没有冒号,所以它会删除一切直到并包括每行的最后一个冒号( 因为*
是默认的贪婪 )。
按照乔希·奥布莱恩的评论,如果你想只替换直至并包括第一个冒号,这样做:
sed "s/[^:]*://"
这将匹配任何不是一个冒号,然后是一个冒号,什么也没有更换。
请注意,对于这些模式,他们将停止对每行第一个匹配的。 如果你想更换一个发生某一行上每场比赛中,添加“ g
”(全局)选项添加到命令的末尾。
还要注意的是在Linux上(而不是在OSX),您可以编辑就地与文件-i
例如:
sed -i 's/.*://' your_file
您可以使用awk
是这样的:
awk -F: '{print $2}' /your/file
如果你有GNU coreutils
可使用cut
:
cut -d: -f2 infile
我工作的一个类似的问题。 约翰和乔希·奥布莱恩的意见并获得成功。 我开始与这个tibble:
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))
下面是2级当量的解决方案:
第一种使用Perl的-a
自动分割功能分割每条线为使用字段:
,填充F
字段阵列,并打印第二场$F[1]
计计数从字段0开始)
perl -F: -lane 'print $F[1]' file
第二个使用正则表达式来代替s///
从^
行的开头, .*:
用冒号结束,什么也没有任何字符
perl -pe 's/^.*://' file
我从最好的回应@Sacha Epskamp错过了一些非常简单的举动就是使用子功能,在这种情况下采取之前的所有“:”(而不是去掉),所以这是非常简单的:
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)
基本上,同样的事情,只是改变了“:”子参数内的位置。 希望这将有助于。