sed キャプチャグループの使用

sed キャプチャグループの使用

次のファイルがあります。

chr1    3143567 3143568 .3-2704 1.000000|ENSMUSG00000102693.2
chr1    3143599 3143600 .3-2705 1.000000|ENSMUSG00000102693.2
chr1    3143631 3143632 .3-2706 1.000000|ENSMUSG00000102693.2
chr1    3143663 3143664 .3-2707 1.000000|ENSMUSG00000102693.2
chr1    3143695 3143696 .3-2708 1.000000|ENSMUSG00000102693.2
chr1    3143727 3143728 .3-2709 1.000000|ENSMUSG00000102693.2

最初の式より前のすべての項目をフィルタリングするために2つのsed式を作成しており|、結果ファイルの場合は、次のように後続のすべての項目を削除します.

sed -n -e 's/^.*|//p' original_file.txt > first_result.txt

sed -n -e 's/\..*//p' first_result.txt > final_result.txt

これらすべてを一行にどのように書くことができますか?

最終目的は取得である。ENSMUSG00000102693

答え1

|コマンドを実行すると、文字を含まない行とマウスの遺伝子識別子にバージョン番号のない行が削除されます。これが意図的なものかどうかはわかりませんが、sed -nコマンドpでフラグを使用して作業する副作用ですs。私はこれが意図しないと仮定します。

2つの表現を使用してくださいsed

sed -e 's/.*|//' -e 's/\..*//' file >newfile

grep非標準オプションでコマンドを使用し、ファイル-oからすべてのEnsemblマウス遺伝子安定IDのみを抽出するとします(ファイルには抽出する安定IDのみが含まれています)。

grep -o 'ENSMUSG[[:digit:]]*' file >newfile

2つのチェーンコマンドを使用することもできますcut。各コマンドは、sedこの回答の前の2つの置換と同様にデータを変更します。静的クリッピングを使用する方が正規表現を使用するよりも高速になる可能性がありますが、入力データが大きくない場合は速度差は大きくないと予想されます。

cut -d '|' -f 2 file | cut -d '.' -f 1 >newfile

答え2

GNUを使用できますgrep(GNUよりもパフォーマンスが少し優れているようですsed)。

$ grep -Po '(?<=\|)[^|.]+' first_result.txt 
ENSMUSG00000102693
ENSMUSG00000102693
ENSMUSG00000102693
ENSMUSG00000102693
ENSMUSG00000102693
ENSMUSG00000102693

  • このパターンは、「aまたは()ではなく、最初の文字()で始まるすべての文字を(?<=\|)[^|.]+見つけて除外する」という意味です。|.[^|.]+|(?<=\|)

そしてsed

$ sed 's/.*|\([^|]\+\)\..*/\1/' first_result.txt  
ENSMUSG00000102693
ENSMUSG00000102693
ENSMUSG00000102693
ENSMUSG00000102693
ENSMUSG00000102693
ENSMUSG00000102693
  • このパターンは、「.*|\([^|]\+\)\..*と(、)の間のすべての文字を削除し、()の間の内容をキャプチャし、最後にすべての文字をキャプチャされたパターン()で置き換えることを意味します。|..*|\..*\([^|]\+\)/\1/

またはもっと簡潔に言えば:

$ sed -E 's/.*\|([^|]+)\..*/\1/'

答え3

以下のように単一の式を使用できますsed|無視する最後の部分まですべて一致し、最後の部分の前の部分をキャプチャして.結果から除外します。 POSIX BREをサポートするすべてのsedで

sed 's/.*|\([^.]*\)\..*/\1/'

awkを好むなら、

awk -F'[|.]' '{ print $(NF-1) }'

関連情報