特定の行数を含むファイルがあります。各行は次のようになります。
TF_list_to_test10004/Nus_k0.345_t0.1_e0.1.adj:PKMYT1
遺伝子名であるPKMYT1のみを保持するために、「:」文字の前のすべてを削除したいと思います。私は正規表現スクリプトの専門家ではないので、Unix(sedまたはawk)またはRを使用して誰でもこれを行うことができますか?
Rでそれを行う2つの方法を次に示します。
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
はthisまたはregexメソッドよりも高速になると思います。
Sedの使用:
sed 's/.*://' < your_input_file > output_file
これにより、コロンが後に続くものは何も置き換えられないため、各行の最後のコロンまでをすべて削除します( because *
はデフォルトで貪欲です )。
Josh O'Brienのコメントによると、最初のコロンまでのみを置換する場合は、次のようにします。
sed "s/[^:]*://"
これはコロンではなく、コロンが1つ続き、何も置換されないものに一致します。
これらのパターンの両方について、各行の最初の一致で停止することに注意してください。行のすべての一致に対して置換を行いたい場合は、コマンドの最後に 'g
'(global) オプションを追加します。
また、Linux(OSXではない)では、-i
例:
sed -i 's/.*://' your_file
次のようにawk
を使用できます。
awk -F: '{print $2}' /your/file
GNU coreutils
が使用可能な場合、cut
を使用します。
cut -d: -f2 infile
私は同様の問題に取り組んでいた。ジョンとジョシュ・オブライエンのアドバイスがトリックをしました。私はこのチブルで始めました:
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))
以下は2つの同等のソリューションです。
1つ目は、Perlの-a
自動分割機能を使用して、:
を使用して各行をフィールドに分割し、F
fields配列に入力し、2番目のフィールド$F[1]
(field 0)
Perl -F: -lane 'print $F[1]' file
2番目は正規表現を使用して、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)
基本的に、同じことは、サブ引数内の「:」位置を変更するだけです。それが役立つことを願っています。