좋아, 비슷한 답변을 찾았지만 sed / grep / awk fu가 너무 가난하여 내 작업에 적응할 수 없었습니다. 즉, "test.gff"파일이 주어지면 :
accn|CP014704 RefSeq CDS 403 915 . + 0 ID=AZ909_00020;locus_tag=AZ909_00020;product=transcriptional regulator
accn|CP014704 RefSeq CDS 928 2334 . + 0 ID=AZ909_00025;locus_tag=AZ909_00025;product=FAD/NAD(P)-binding oxidoreductase
accn|CP014704 RefSeq CDS 31437 32681 . + 0 ID=AZ909_00145;locus_tag=AZ909_00145;product=gamma-glutamyl-phosphate reductase;gene=proA
accn|CP014704 RefSeq CDS 2355 2585 . + 0 ID=AZ909_00030;locus_tag=AZ909_00030;product=hypothetical protein
두 개의 값을 추출하고 싶습니다. 1) "ID ="의 오른쪽에 세미콜론까지, 2) "product ="오른쪽에있는 텍스트 (줄 끝까지) 또는 세미콜론 (다음 중 하나를 볼 수 있으므로 행에는 "gene ="값도 있습니다.
그래서 나는 다음과 같은 것을 원합니다.
ID product
AZ909_00020 transcriptional regulator
AZ909_00025 FAD/NAD(P)-binding oxidoreductase
AZ909_00145 gamma-glutamyl-phosphate reductase
이것은 내가 얻은 것입니다.
printf "ID\tproduct\n"
sed -nr 's/^.*ID=(.*);.*product=(.*);/\1\t\2\p/' test.gff
감사!
다음을 시도하십시오.
sed 's/.*ID=\([^;]*\);.*product=\([^;]*\).*/\1\t\2/' test.gff
당신의 시도에 비해 제품에 맞는 방식을 변경했습니다. 필드가 ;
또는로 끝나는 지 알 수 없기 때문에 EOL
가능한 가장 많은 비 ;
문자 수와 일치합니다 . 또한 .*
제품 뒤에 남은 문자와 일치하도록 끝에를 추가했습니다 . 이렇게하면 대체를 수행 할 때 전체 라인이 일치하고 완전히 다시 작성할 수 있습니다.
좀 더 강력한 것을 원한다면 여기에 펄 한 줄짜리가 있습니다.
perl -nle '($id)=/ID=([^;]*)/; ($prod)=/product=([^;]*)/; print "$id\t$prod"' test.gff
정규식을 사용하여 두 필드를 개별적으로 추출합니다. 필드가 역순으로 표시 되더라도 올바르게 작동합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다