Unix의 패턴 일치 및 캡처

Unix의 패턴 일치 및 캡처

다음과 같은 파일이 있습니다.

A1-1915435_1_MIMAT0000069_MirBase_miR-16_microRNA_1_22-A1-1915435_1_ENSG00000206737_ENST00000384010_U1_snRNA_73_115
A1-2362643_1_MIMAT0000732_MirBase_miR-378_microRNA_1_21-A1-2362643_1_ENSG00000222328_ENST00000410396_U2_snRNA_168_211

마이크로 RNA 섹션과 ENSG 섹션에 대해 별도의 탭이 있는 출력을 원합니다. 이 같은:

miR-16_microRNA ENSG00000206737
miR-378_microRNA    ENSG00000222328

Perl 스크립트를 작성할 수 있지만 awk, sed Perl 등을 사용하는 명령줄 솔루션이 있어야 할 것 같습니다.

답변1

perl -pe 's!.*(miR-\d+_microRNA).*(ENSG\d+).*!$1\t$2!'

설명하다?

물론입니다. 죄송합니다.

  • 각 라인에 대해 (perl -p)
  • 정규 표현식을 $1 tab $2where 로 대체
    • $1$2캡처 그룹에 대한 역참조로 번호가 매겨 집니다 (...). 거의 모든 최신 정규식 엔진이 이를 지원합니다.
  • 정규식 정보:
    • . =를 제외한 모든 문자\n
    • .*= 문자 시퀀스(대체 시 무시됨)
    • \d= 숫자 ( 와 동일 [0-9])
    • \d+= 하나 이상\d

아무거나 봐주세요reg 표현식 튜토리얼더 자세한 설명을 원하시면.

답변2

사용 sed:

sed 's/^.*\(miR-[0-9]*_microRNA\).*\(ENSG[0-9]*\).*$/\1\t\2/' <infile

답변3

사용형식이 신뢰할 수 있다고 가정합니다.

$ awk -F'_' '{print $5"_"$6, $11}' file
miR-16_microRNA ENSG00000206737
miR-378_microRNA ENSG00000222328

답변4

sed -n 'y/_E/\t\n/;s/\n/E/;s/[^m]*//;s/\(A.\).*E/\1E/;P'

귀하의 예를 고려할 때 이것은 나에게 효과적이었습니다 ...

miR-16  microRNA        ENSG00000206737
miR-378 microRNA        ENSG00000222328

\t첫 번째 ab를 다시 a로 변환하려면 before를 추가 _할 수 있지만 이 방법이 더 좋아 보인다고 생각합니다.s/\t/_/P

다른 방법은 다음과 같습니다.

sed 's/RNA[^E]*_/RNA\t/;s/[^m]*//;s/_E.*//'

...또는...

sed 's/[^mE]*\([mE][^mE_]*\)/\1/;s//\t\1/3;s/_E.*//'

...둘 다 원하는 출력에 표시되는 내용을 인쇄합니다.

miR-16_microRNA ENSG00000206737
miR-378_microRNA        ENSG00000222328

. 어떤 경우 \t든 구현에 따라 이스케이프 문자 대신 리터럴 문자를 사용해야 할 수도 있습니다 sed.

관련 정보