59

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

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

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

4

10 に答える 10

96

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))
于 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/[^:]*://"

これは、コロン以外のすべてに一致し、その後に 1 つのコロンが続き、何も置き換えません。

これらのパターンの両方で、各行の最初の一致で停止することに注意してください。行のすべての一致に対して置換を実行する場合は、コマンドの末尾に' g' (グローバル)オプションを追加します。

また、Linux (OSX ではなく) では、次のようにファイルをその場で編集できることに注意してください-i

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

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

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 に答える
2

GNU を使用できる場合は、次をcoreutils使用しますcut

cut -d: -f2 infile
于 2012-09-06T12:49:01.030 に答える
0

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

1 つ目は、perl の-aautosplit 機能を使用して、 を使用して各行をフィールドに分割し、 fields 配列に:入力して、2 番目のフィールドを出力します(フィールド 0 から数えます)。F$F[1]

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

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

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