다음과 같은 파일이 있습니다.
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) }'