각 줄에서 특정 문자를 추출합니다.

각 줄에서 특정 문자를 추출합니다.

텍스트 파일이 있고 그 뒤에 나오는 각 줄에서 문자열을 추출하고 싶습니다."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에서는 공백이 아닌 두 개의 "단어"가 있습니다.

$ 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를 사용하여 다음 =가 포함된 단어를 찾을 때까지 전체 값을 구문 분석하는 것입니다. 이렇게 하면 모든 크기 값에 대해 작동합니다(예: 글꼴에 한 단어 또는 세 단어가 포함된 경우).

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

첫 번째 블록은 이전의 모든 것을 캡처하고 OS=, 캡처 그룹( \(\)'s로 표시)의 두 번째 블록은 다음 블록과 일치하며 =대체 블록으로 호출될 수 있습니다 \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

관련 정보