다음과 같은 파일이 있습니다.
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 $2
where 로 대체$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
.