![소수점 뒤의 숫자 제거](https://linux55.com/image/12998/%EC%86%8C%EC%88%98%EC%A0%90%20%EB%92%A4%EC%9D%98%20%EC%88%AB%EC%9E%90%20%EC%A0%9C%EA%B1%B0.png)
다음 필드가 포함된 입력 파일이 있습니다.
ENST00000456328.2 1657 1350.015 0 0
소수점 이하의 숫자를 제거하고 나머지는 그대로 인쇄하려고합니다.
awk -F[.] '{print $1"\t"$2"\t"$3}{next;}'
그러나 다음과 같은 출력이 제공되므로 작동하지 않습니다.
ENST00000456328 2 1657 1350 015 0 0
누구든지 도울 수 있습니까?
인사.
답변1
입력이 탭으로 구분되어 있고 이를 유지하려는 경우 다음 명령을 사용하여 Ensembl stable ID에서 버전 번호를 제거할 수 있습니다.
$ awk 'BEGIN { OFS=FS="\t" } { sub("\\..*", "", $1); print }' file
ENST00000456328 1657 1350.015 0 0
이렇게 하면 탭으로 구분된 첫 번째 필드에만 교체가 적용되고 첫 번째 점 뒤의 모든 항목이 제거됩니다.
마찬가지로 다음이 있습니다 sed
.
$ sed 's/\.[^[:blank:]]*//' file
ENST00000456328 1657 1350.015 0 0
이렇게 하면 각 줄의 첫 번째 점 뒤의 공백이 아닌 문자가 모두 제거됩니다. \.[[:digit:]]*
공백이 아닌 숫자 대신 명시적으로 숫자와 일치하는 as 패턴을 사용할 수도 있습니다 .
데이터에 버전이 지정되지 않은 Ensembl ID 또는 다른 데이터베이스의 ID가 있는 경우 행을 수정하기 전에 버전이 지정된 Ensembl ID가 일치하는지 확인하는 것이 좋습니다. 의 경우 awk
이는 다음과 같이 수행할 수 있습니다.
$ awk 'BEGIN { OFS=FS="\t" } /^ENS[^[:blank:]]*\./ { sub("\\..*", "", $1) } { print }' file
ENST00000456328 1657 1350.015 0 0
이제 print
첫 번째 필드를 수정한 블록과 다른 블록에 있습니다. 이렇게 하면 모든 줄(수정 여부에 관계없이)이 인쇄됩니다. 입력 시간이나 공간이 부족한 경우 { print }
전체 블록을 더 짧은 블록으로 교체할 수 있습니다.1
그리고 sed
:
$ sed '/^ENS[^[:blank:]]*\./s/\.[^[:blank:]]*//' file
ENST00000456328 1657 1350.015 0 0
코드는 sed
수정 여부에 관계없이 모든 행을 이미 인쇄하므로 다른 수정이 필요하지 않습니다(반면 코드에서 awk
결과 출력은 첫 번째 변형에 비해 약간 더 합리적이어야 합니다 awk
).
^ENS[^[:blank:]]*\.
마지막 두 변형에서는 수정을 시도하기 전에 줄 시작 부분에 있는 버전이 지정된 Ensembl ID를 정규 표현식과 일치시킵니다.
위의 변형 중 어느 것도 라인의 나머지 데이터에 관심을 두거나 신경 쓸 필요가 없습니다. 각 행에는 수정되지 않은 채 전달되는 추가 필드가 포함될 수 있습니다.
점을 필드 구분 기호로 사용하는 것이 영감을 주었지만 행의 더 많은 데이터에 점이 포함되어 있기 때문에 문제가 발생합니다.
답변2
필드에 관계없이 모든 소수를 제거하고 다른 필드에서 소수의 가능성을 처리할 수 있으려면 gsub 함수를 사용할 수 있습니다.
awk '{gsub(/\.[0-9]+ /, " ")}1'
이렇게 하면 소수 뒤에 1부터 무한한 숫자와 공백이 오는 것을 찾은 다음 공백으로 바꿉니다.
답변3
사용행복하다(이전 Perl_6)
~$ raku -ne '.words andthen put join "\t", .[0].subst(/\.\d+/), .[1..*];' file
Raku는 Perl 계열의 프로그래밍 언어입니다. 생태계는 여전히 작지만 텍스트 처리 기능(예: Perl)은 생물정보학에 적합한 선택입니다.
-ne
위에서 Raku는 자동 인쇄가 아닌 라인별 플래그(예: 유사한 동작)를 사용하여 명령줄에서 awk
호출됩니다 . 줄은 공백으로 구분된 줄로 나뉘며 words
, 첫 번째 단어( )는 뒤따르는 점을 식별하고 제거하는 .[0]
데 사용됩니다 . subst
[ subst
교체 없이 Raku 명령을 사용하여 인식된 패턴을 제거합니다.] 그런 다음 수정된 첫 번째 단어와 .[1..*]
(나머지 줄)이 join
탭과 out 에서 편집됩니다 put
.
입력 예:
ENST00000456328.2 1657 1350.015 0 0
ENST00000456329 1657 1350.015 0 0
예제 출력:
ENST00000456328 1657 1350.015 0 0
ENST00000456329 1657 1350.015 0 0
위에서는 첫 번째 열만 수정되었습니다.