>
나는 각 서열 이름이 다음 줄의 해당 서열을 사용하여 식별되는 큰 단백질 서열 파일을 가지고 있습니다 .
예(따옴표 무시):
>YAL003W EFB1 SGDID:S000000003, Chr I from 142174-142253,142620-143160, Genome Release 64-1-1, Verified ORF, "Translation elongation factor 1 beta; stimulates nucleotide exchange to regenerate EF-1 alpha-GTP for the next elongation cycle; part of the EF-1 complex, which facilitates binding of aminoacyl-tRNA to the ribosomal A site"
MASTDFSKIETLKQLNASLADKSYIEGTAVSQADVTVFKAFQSAYPEFSRWFNHIASKAD
EFDSFPAASAAAAEEEEDDDVDLFGSDDEEADAEAEKLKAERIAAYNAKKAAKPAKPAAK
SIVTLDVKPWDDETNLEEMVANVKAIEMEGLTWGAHQFIPIGFGIKKLQINCVVEDDKVS
LDDLQQSIEEDEDHVQSTDIAAMQKL*
대부분의 이름 텍스트를 제거하여 다음과 같이 보이도록 하고 싶습니다(따옴표 무시).
>YAL003W EFB1
MASTDFSKIETLKQLNASLADKSYIEGTAVSQADVTVFKAFQSAYPEFSRWFNHIASKAD
FDSFPAASAAAAEEEEDDDVDLFGSDDEEADAEAEKLKAERIAAYNAKKAAKPAKPAAK
SIVTLDVKPWDDETNLEEMVANVKAIEMEGLTWGAHQFIPIGFGIKKLQINCVVEDDKVS
LDDLQQSIEEDEDHVQSTDIAAMQKL*
이름은 한 줄로만 계산되지만 시퀀스는 여러 줄로 계산되므로 내 질문입니다. 이 문제를 어떻게 해결할 수 있나요?
답변1
이상한 솔루션
$ awk '/>/ { print $1, $2; next } { print }' aa
>YAL003W EFB1
MASTDFSKIETLKQLNASLADKSYIEGTAVSQADVTVFKAFQSAYPEFSRWFNHIASKAD
EFDSFPAASAAAAEEEEDDDVDLFGSDDEEADAEAEKLKAERIAAYNAKKAAKPAKPAAK
SIVTLDVKPWDDETNLEEMVANVKAIEMEGLTWGAHQFIPIGFGIKKLQINCVVEDDKVS
LDDLQQSIEEDEDHVQSTDIAAMQKL*
- />/한 줄로 검색>
- next; awk 파일에서 더 이상 패턴을 읽지 않습니다.
답변2
다음은 몇 가지 해결 방법입니다.
grep
. 이 패턴은>
공백이 아닌 2개의 연속된 문자열([^ ]+ [^ ]+
) 또는 임의의 문자( )로.+
시작하는 줄을 검색합니다. 각 줄의 일치하는 부분만 인쇄 하는 이유는 다음과 같습니다-o
.grep
$ grep -oP '^(>[^ ]+ [^ ]+|.+)' file.fa >YAL003W EFB1 MASTDFSKIETLKQLNASLADKSYIEGTAVSQADVTVFKAFQSAYPEFSRWFNHIASKAD EFDSFPAASAAAAEEEEDDDVDLFGSDDEEADAEAEKLKAERIAAYNAKKAAKPAKPAAK SIVTLDVKPWDDETNLEEMVANVKAIEMEGLTWGAHQFIPIGFGIKKLQINCVVEDDKVS LDDLQQSIEEDEDHVQSTDIAAMQKL*
awk
$ awk '{if(/>/){print $1,$2}else{print}}' file.fa >YAL003W EFB1 MASTDFSKIETLKQLNASLADKSYIEGTAVSQADVTVFKAFQSAYPEFSRWFNHIASKAD EFDSFPAASAAAAEEEEDDDVDLFGSDDEEADAEAEKLKAERIAAYNAKKAAKPAKPAAK SIVTLDVKPWDDETNLEEMVANVKAIEMEGLTWGAHQFIPIGFGIKKLQINCVVEDDKVS LDDLQQSIEEDEDHVQSTDIAAMQKL*
암소 비슷한 일종의 영양
sed
$ sed -r 's/(>[^ ]+ [^ ]+).*/\1/' file.fa >YAL003W EFB1 MASTDFSKIETLKQLNASLADKSYIEGTAVSQADVTVFKAFQSAYPEFSRWFNHIASKAD EFDSFPAASAAAAEEEEDDDVDLFGSDDEEADAEAEKLKAERIAAYNAKKAAKPAKPAAK SIVTLDVKPWDDETNLEEMVANVKAIEMEGLTWGAHQFIPIGFGIKKLQINCVVEDDKVS LDDLQQSIEEDEDHVQSTDIAAMQKL*
어느
sed
$ sed 's/\(>[^ ]* [^ ]*\).*/\1/' file.fa >YAL003W EFB1 MASTDFSKIETLKQLNASLADKSYIEGTAVSQADVTVFKAFQSAYPEFSRWFNHIASKAD EFDSFPAASAAAAEEEEDDDVDLFGSDDEEADAEAEKLKAERIAAYNAKKAAKPAKPAAK SIVTLDVKPWDDETNLEEMVANVKAIEMEGLTWGAHQFIPIGFGIKKLQINCVVEDDKVS LDDLQQSIEEDEDHVQSTDIAAMQKL*
cut
$ cut -d ' ' -f 1,2 file.fa >YAL003W EFB1 MASTDFSKIETLKQLNASLADKSYIEGTAVSQADVTVFKAFQSAYPEFSRWFNHIASKAD EFDSFPAASAAAAEEEEDDDVDLFGSDDEEADAEAEKLKAERIAAYNAKKAAKPAKPAAK SIVTLDVKPWDDETNLEEMVANVKAIEMEGLTWGAHQFIPIGFGIKKLQINCVVEDDKVS LDDLQQSIEEDEDHVQSTDIAAMQKL*
진주.
$ perl -lane 'print "@F[0..1]"' file.fa >YAL003W EFB1 MASTDFSKIETLKQLNASLADKSYIEGTAVSQADVTVFKAFQSAYPEFSRWFNHIASKAD EFDSFPAASAAAAEEEEDDDVDLFGSDDEEADAEAEKLKAERIAAYNAKKAAKPAKPAAK SIVTLDVKPWDDETNLEEMVANVKAIEMEGLTWGAHQFIPIGFGIKKLQINCVVEDDKVS LDDLQQSIEEDEDHVQSTDIAAMQKL*
옵션은 다음과 같습니다
l
: 각 입력 줄에서 후행 줄 바꿈을 제거하고 각 인쇄 호출에 줄 바꿈을 추가합니다.a
: 공백의 각 입력 행을@F
배열로 분할합니다.n
: 입력 파일을 한 줄씩 읽습니다.e
:각 줄에서 이 스크립트를 실행합니다.
스크립트 자체는 첫 번째와 두 번째 필드만 인쇄합니다. 시퀀스 라인의 경우 첫 번째 필드인 사용 가능한 유일한 필드만 인쇄합니다. 이것이 전체 라인입니다.