次のファイルがあります。
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) }'