各行から特定の文字を抽出します。

各行から特定の文字を抽出します。

テキストファイルがあり、それに続く各行から文字列を抽出したいと思います。"OS="

input file line
A0A0A9PBI3_ARUDO Uncharacterized protein OS=Arundo donax OX=35708 PE=4 SV=1
K3Y356_SETIT ATP-dependent DNA helicase OS=Setaria italica OX=4555 PE=3 SV=1

希望の出力

OS=Arundo donax
OS=Setaria italica

または

Arundo donax
Setaria italica

答え1

拡張正規表現grep(または互換バージョン)でGNUを使用する:

grep -Eo "OS=\w+ \w+" file

またはデフォルトの正規表現(エスケープする必要があります)+

grep -o "OS=\w\+ \w\+" file
# or
grep -o "OS=\w* \w*" file

OS=からまでのすべてを得るには、可能であればPerl互換正規表現(PCRE)(オプション)をOX=使用して事前に確認してください。grep-P

grep -Po "OS=.*(?=OX=)" file

#to also leave out "OS="
#use lookbehind
grep -Po "(?<=OS=).*(?=OX=)" file
#or Keep-out \K
grep -Po "OS=\K.*(?=OX=)" file

またはgrep包含を使用OX=して後で削除しますsed

grep -o "OS=.*\( OX=\)" file | sed 's/ OX=$//'

出力:

OS=Arundo donax
OS=Setaria italica

答え2

Perlでは、空白ではなく2つの「単語」があります。

$ perl -lne 'print $1 if /OS=(\S+ \S+)/' input

または次のすべてOX=

$ perl -lne 'print $1 if /OS=(.*?) OX=/' input 

または以下のすべてsomething=

$ perl -lne 'print $1 if /OS=(.*?) (\w+)=/' input

入力例の場合、どちらも同じ出力を提供しますが、出力は次の入力と同じです。

ABC=something here OS=foo bar doo PE=3 OX=1234

答え3

より信頼できる方法は、sedを使用して、次の=を含む単語が見つかるまで値全体を解析することです。これはすべてのサイズ値に対して機能します(たとえば、フォントに1つの単語または3つの単語が含まれている場合など)。

sed 's/.*OS=\([^=]*\).*/\1/;s/ [^ ]*$//'

最初のブロックは前のものをすべてキャプチャし、OS=キャプチャグループ(\(\)「s」と表示)の2番目のブロックは次のブロックと一致し、代替=ブロックとして呼び出すことができます\1。次の置換は、次に割り当てられたフラグメントである最後の単語を削除します。

注:^inは[]除外一致文字です。この場合、すべていいえマーク=

答え4

awk '{print $(NF-4), $(NF-3)}' file

OS=Arundo donax
OS=Setaria italica 

または

awk -F= '{sub(/OX/,""); print $(NF-3)}' file 

Arundo donax 
Setaria italica

関連情報