特定の行数を含むファイルがあります。各行は次のようになります。
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
を参照してください。
sed を使用:
sed 's/.*://' < your_input_file > output_file
これにより、コロンが後に続くものはすべて何も置き換えられないため、各行の最後のコロンまでのすべてが削除されます (はデフォルトで貪欲であるため*
)。
Josh O'Brien のコメントによると、最初のコロンまでのみを置き換えたい場合は、次のようにします。
sed "s/[^:]*://"
これは、コロン以外のすべてに一致し、その後に 1 つのコロンが続き、何も置き換えません。
これらのパターンの両方で、各行の最初の一致で停止することに注意してください。行のすべての一致に対して置換を実行する場合は、コマンドの末尾に' g
' (グローバル)オプションを追加します。
また、Linux (OSX ではなく) では、次のようにファイルをその場で編集できることに注意してください-i
。
sed -i 's/.*://' your_file
R には確かに 2 つ以上の方法があります。別の方法を次に示します。
unlist(lapply(strsplit(foo, ':', fixed = TRUE), '[', 2))
substr
文字列の長さが一定の場合、これまたは正規表現の方法よりも高速になると思います。
awk
次のように使用できます。
awk -F: '{print $2}' /your/file
GNU を使用できる場合は、次をcoreutils
使用しますcut
。
cut -d: -f2 infile
以下は、2 つの同等のソリューションです。
1 つ目は、perl の-a
autosplit 機能を使用して、 を使用して各行をフィールドに分割し、 fields 配列に:
入力して、2 番目のフィールドを出力します(フィールド 0 から数えます)。F
$F[1]
perl -F: -lane 'print $F[1]' file
2 つ目は、正規表現を使用して、行の先頭s///
から、コロンで終わるすべての文字 を置換します。^
.*:
perl -pe 's/^.*://' file