sed 캡처 그룹 사용

sed 캡처 그룹 사용

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

chr1    3143567 3143568 .3-2704 1.000000|ENSMUSG00000102693.2
chr1    3143599 3143600 .3-2705 1.000000|ENSMUSG00000102693.2
chr1    3143631 3143632 .3-2706 1.000000|ENSMUSG00000102693.2
chr1    3143663 3143664 .3-2707 1.000000|ENSMUSG00000102693.2
chr1    3143695 3143696 .3-2708 1.000000|ENSMUSG00000102693.2
chr1    3143727 3143728 .3-2709 1.000000|ENSMUSG00000102693.2

첫 번째 표현식 이전의 모든 항목을 필터링하기 위해 2개의 sed 표현식을 작성하고 있으며 |, 결과 파일의 경우 다음과 같이 이후의 모든 항목을 삭제합니다 ..

sed -n -e 's/^.*|//p' original_file.txt > first_result.txt

sed -n -e 's/\..*//p' first_result.txt > final_result.txt

이 모든 것을 한 줄에 어떻게 쓸 수 있습니까?

최종 목표는 포획이다.ENSMUSG00000102693

답변1

|명령을 실행하면 문자가 포함되지 않은 줄과 마우스 유전자 식별자에 버전 번호가 없는 줄이 삭제됩니다 . 이것이 의도적인 것인지는 확실하지 않지만 sed -n명령 p에서 플래그를 사용하여 작업하는 부작용 입니다 s. 나는 이것이 의도하지 않은 것이라고 가정합니다.

두 가지 표현을 사용하십시오 sed.

sed -e 's/.*|//' -e 's/\..*//' file >newfile

grep비표준 옵션과 함께 명령을 사용하고 -o파일에서 모든 Ensembl 마우스 유전자 안정 ID만 추출한다고 가정하고(파일에는 추출하려는 안정 ID만 포함되어 있음)

grep -o 'ENSMUSG[[:digit:]]*' file >newfile

두 개의 체인 명령을 사용할 수도 있습니다 cut. 각 명령은 sed이 답변 앞부분의 두 대체와 유사하게 데이터를 수정합니다. 정적 클리핑을 사용하는 것이 정규식을 사용하는 것보다 빠를 수 있지만 입력 데이터가 크지 않으면 속도 차이가 크지 않을 것으로 예상됩니다.

cut -d '|' -f 2 file | cut -d '.' -f 1 >newfile

답변2

GNU를 사용할 수 있습니다 grep(GNU보다 성능이 약간 더 나은 것 같습니다 sed).

$ grep -Po '(?<=\|)[^|.]+' first_result.txt 
ENSMUSG00000102693
ENSMUSG00000102693
ENSMUSG00000102693
ENSMUSG00000102693
ENSMUSG00000102693
ENSMUSG00000102693

  • 이 패턴은 "a 또는 ( )가 아닌 첫 글자 ( )로 시작하는 모든 문자를 (?<=\|)[^|.]+찾아서 제외한다"는 의미입니다 .|.[^|.]+|(?<=\|)

그리고 sed:

$ sed 's/.*|\([^|]\+\)\..*/\1/' first_result.txt  
ENSMUSG00000102693
ENSMUSG00000102693
ENSMUSG00000102693
ENSMUSG00000102693
ENSMUSG00000102693
ENSMUSG00000102693
  • 이 패턴은 " .*|\([^|]\+\)\..*과 ( , ) 사이의 모든 문자를 제거하고 ( ) 사이의 내용을 캡처하고, 마지막으로 모든 문자를 캡처된 패턴( )으로 대체한다는 의미입니다.|..*|\..*\([^|]\+\)/\1/

또는 더 간결하게 말하면:

$ sed -E 's/.*\|([^|]+)\..*/\1/'

답변3

아래와 같이 단일 표현식을 사용할 수 있습니다 sed. |무시할 마지막 부분까지 모두 일치시킨 다음 마지막 부분 이전 부분을 캡처하여 .결과에서 제외합니다. POSIX BRE를 지원하는 모든 sed에서

sed 's/.*|\([^.]*\)\..*/\1/'

awk를 선호한다면,

awk -F'[|.]' '{ print $(NF-1) }'

관련 정보