세 개의 열이 있는 파일이 있습니다. 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
NF
awk
현재 레코드(행)의 필드(열) 개수를 포함하는 변수 입니다 . 각 줄에 이 번호를 인쇄하고 그 뒤에 쉼표와 줄의 나머지 부분을 인쇄합니다.
다른 옵션(결과는 동일하지만 더 깔끔해 보일 수 있음):
$ 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 및 쉼표( )로 바꿉니다.perl
awk
-F
@F
$#F
@F
0
$#F+1
-p
-e
s///
^
$#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