web-dev-qa-db-ja.com

コロンの前のすべてのテキストを削除します

特定の行数を含むファイルがあります。各行は次のようになります。

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

遺伝子名であるPKMYT1のみを保持するために、「:」文字の前のすべてを削除したいと思います。私は正規表現スクリプトの専門家ではないので、Unix(sedまたはawk)またはRを使用して誰でもこれを行うことができますか?

40
Elb

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))
59
Sacha Epskamp

gsub()で使用される単純な正規表現:

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

見る ?regexまたは?gsubさらなるヘルプ。

10
Andrie

Rには確かに2つ以上の方法があります。別の方法があります。

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

文字列の長さが一定の場合、substrはthisまたはregexメソッドよりも高速になると思います。

9
John

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
8
John Carter

次のようにawkを使用できます。

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

GNU coreutilsが使用可能な場合、cutを使用します。

cut -d: -f2 infile
2
Thor

私は同様の問題に取り組んでいた。ジョンとジョシュ・オブライエンのアドバイスがトリックをしました。私はこのチブルで始めました:

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))
1
Leslie Sage

以下は2つの同等のソリューションです。

1つ目は、Perlの-a自動分割機能を使用して、:を使用して各行をフィールドに分割し、F fields配列に入力し、2番目のフィールド$F[1](field 0)

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

2番目は正規表現を使用して、s///を行の先頭の^から、.*:コロンで終わる任意の文字に置き換えます。

Perl -pe 's/^.*://' file
0
Chris Koknat

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

基本的に、同じことは、サブ引数内の「:」位置を変更するだけです。それが役立つことを願っています。