텍스트 파일이 있고 그 뒤에 나오는 각 줄에서 문자열을 추출하고 싶습니다."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