연속된 패턴의 발생 횟수를 계산하는 방법

연속된 패턴의 발생 횟수를 계산하는 방법

세 개의 열이 있는 파일이 있습니다. 3열에는 다음과 같은 유전자 이름이 포함되어 있습니다.

Rv0729,Rv0993,Rv1408  
Rv0162c,Rv0761c,Rv1862,Rv3086  
Rv2790c

각 줄의 유전자 수를 인쇄하는 방법은 무엇입니까?

답변1

하나의 열과 그 안에 있는 열 수만 추가하려고 합니다. 이는 다음을 사용하여 수행할 수 있습니다 awk.

$ awk -F ',' '{ printf("%d,%s\n", NF, $0) }' data.in
3,Rv0729,Rv0993,Rv1408
4,Rv0162c,Rv0761c,Rv1862,Rv3086
1,Rv2790c

NFawk현재 레코드(행)의 필드(열) 개수를 포함하는 변수 입니다 . 각 줄에 이 번호를 인쇄하고 그 뒤에 쉼표와 줄의 나머지 부분을 인쇄합니다.

다른 옵션(결과는 동일하지만 더 깔끔해 보일 수 있음):

$ awk -F ',' 'BEGIN { OFS=FS } { print NF, $0 }' data.in

FS는 각 레코드를 필드로 분할하는 데 사용되는 필드 구분 기호이므로 awk명령줄에서 쉼표로 설정합니다(첫 번째 솔루션에 표시됨). ~이다-F ','OFS산출FS필드 구분 기호는 입력의 첫 번째 줄을 읽기 전과 동일하게 설정합니다.

답변2

Rv[0-9]{4}c?질문 주제에서 제안하는 것처럼 쉼표로 구분된 필드 수 대신 패턴 발생 횟수를 계산하려면 다음을 수행할 수 있습니다.

 awk '{print gsub(/Rv[0-9]{4}c?/, "&"), $0}'

답변3

펄 방법:

$ perl -F, -pae 's/^/$#F+1 . ","/e' file
3,Rv0729,Rv0993,Rv1408  
4,Rv0162c,Rv0761c,Rv1862,Rv3086  
1,Rv2790c

Brand는 각 입력 행에서 주어진 문자열을 분할 하고 결과 필드를 배열에 저장하는 것처럼 -a동작합니다 . 따라서 는 에서 가장 높은 배열 인덱스 이고 배열은 처음부터 계산되므로 배열의 총 요소 수입니다 . "주어진 스크립트를 적용한 후 각 입력 줄을 인쇄합니다 . 이것은 대체 연산자입니다. 여기서 줄 의 시작 부분을 필드 수 + 1 및 쉼표( )로 바꿉니다.perlawk-F@F$#F@F0$#F+1-p-es///^$#F+1 . ","

답변4

귀하의 질문에 따르면 열 3에 유전자 이름이 포함되어 있습니다. 실제 입력은 다음과 같다고 가정합니다.

column1 column2 Rv0729,Rv0993,Rv1408  
column1 column2 Rv0162c,Rv0761c,Rv1862,Rv3086  
column1 column2 Rv2790c

열 3의 각 유전자 이름에는 선행 Rv하위 문자열이 포함되어 있습니다. 따라서 Python에서는 다음과 같이 계산할 수 있습니다.

$ python -c  "import sys;print map(lambda x: x.split()[2].count('Rv'),sys.stdin.readlines())"  < input.txt               
[3, 4, 1]

결과 목록에는 각 행의 유전자 수가 해당 순서대로 표시됩니다. 더 자세히 설명하고 유전자에 "Rv" 문자열이 포함되지 않을 가능성을 포함하려면(그러나 열 3이 쉼표로 구분된 값 문자열이라는 가정은 유지) 다음을 수행할 수도 있습니다.

#!/usr/bin/env python
import sys
with open(sys.argv[1]) as fd:
    for index,line in enumerate(fd):
        columns = line.strip().split()
        num_genes=len(columns[2].split(","))
        print("Line "+str(index)+" contains "+str(num_genes))

테스트 실행:

$ ./count_genes.py input.txt                                                                                             
Line 0 contains 3
Line 1 contains 4
Line 2 contains 1

관련 정보