소수점 뒤의 숫자 제거

소수점 뒤의 숫자 제거

다음 필드가 포함된 입력 파일이 있습니다.

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

위에서는 첫 번째 열만 수정되었습니다.

https://raku.org

관련 정보