검색했지만 내 문제에 대한 해결책을 찾을 수 없습니다. 다음과 같은 문자 A
, T
및 (DNA 서열을 나타냄) 문자열 C
을 포함하는 파일이 있습니다 .G
$ cat species_gene
>genus_1_species_1
TTGGATATTGAGTTACATACATATGATTTGGGAATGGAGAACCGAGATAAGACTGAAGATCAAGTCACAATTGATTGTGC
TAATGCTGTCAAGAAATACAATGTCGGCATCAAATGTGCAACTATTACTCCTGATGAAAATCGAGTTGAGGAGTTCAAGC
>tribe_1_species_1
CTGGATATAGAGTTGCACACATACGATCTGGGAATGGAAAACCGCGACAAGACTGATGACCAAGTCACAATCGATTGCGC
CAACGCGATTAAAAAATACAACGTTGGAATTAAGTGCGCGACCATCACTCCCGACGAGAAGAGAGTCGAGGAATTCAAGC
>species_2
CTTGATATTGAACTACACACCTATGATTTGGGAATGGAATACCGCGATAAAACTGATGACCAAGTCACAATTGACTGCGC
KAATGCTATTAAGAAATACAATGTTGGTATTAAGTGCGCTACCATAACTCCAGATGAAAAAAGAGTTGAAGAATTCAAAC
>genus_1_species_1
제목 뒤의 문자열에서 다음 제목까지 문자 수를 세고 싶습니다 . 이 예에서 다음 문자열의 길이는 160과 같습니다.
TTGGATATTGAGTTACATACATATGATTTGGGAATGGAGAACCGAGATAAGACTGAAGATCAAGTCACAATTGATTGTGC
TAATGCTGTCAAGAAATACAATGTCGGCATCAAATGTGCAACTATTACTCCTGATGAAAATCGAGTTGAGGAGTTCAAGC
>
awk를 사용하고 레코드 구분 기호와 개행 문자를 필드 구분 기호로 사용한 다음 레코드의 두 번째 줄부터 시작하여 필드(즉, 줄) 수를 계산하고 싶습니다 . 다음 명령을 사용했습니다.
$ awk 'BEGIN {RS=">"} NR==2 {print length}' species_gene
180(첫 번째 레코드의 문자 수)을 얻었습니다. 내가 얻고 싶은 출력은 160(두 번째 행에서 시작하는 첫 번째 레코드의 길이)입니다. 헤더를 삭제하려면 다음 방법 중 하나를 시도했습니다.
$ awk 'BEGIN {RS=">"; FS="\n"} NR==2 {if (NF!=1) {length}}' species_gene
누군가가 나를 도울 수 있다면 기쁠 것입니다.
답변1
IMHO 빈 줄을 레코드 구분 기호로 사용하는 것이 더 자연스럽습니다. 이 "단락 모드"에서 awk에는 필드 구분 기호로 줄 바꿈이 포함되어 있으므로 레코드의 각 줄이 필드가 됩니다. 그런 다음 빈 문자열을 할당하여 첫 번째 필드를 제거할 수 있습니다. 이는 지정된 출력 필드 구분 기호를 사용하여 전체 레코드를 다시 평가하는 좋은 부작용이 있습니다. 이를 빈 문자열로 설정하면 나머지 필드가 연결됩니다. 그런 다음 레코드 길이를 간단히 인쇄할 수 있습니다.
awk 'BEGIN {RS="";OFS=""} NR==1 {$1=""; print length}' species_gene
주어진 입력을 사용하여 테스트
$ awk 'BEGIN {RS="";OFS=""} NR==1 {$1=""; print length}' species_gene
160
답변2
length
awk에서는 변수일 뿐만 아니라 함수이기도 합니다.
$ awk 'BEGIN {RS=">"} NR==2 {print length($2) + length($3)}' species_gene
160
그게 전부입니다. 전체 레코드 길이를 사용하는 대신 두 필드의 길이를 모두 추가하면 됩니다.
더 짧게:
$ awk 'BEGIN {RS=">"} NR==2 {print length($2 $3)}' species_gene
160
또한 길다:
$ awk 'BEGIN {RS=">"} NR==2 && $0 = length($2 $3)' species_gene
160
답변3
가능한 사소한 개선당신의 진행 상황도착하다스틸 드라이버의 답변:
awk -vRS=">" -vOFS="" '$1=="genus_1_species_1" {$1=""; print length;}' species_gene
은 -vRS=">"
와 동일하며 BEGIN {RS=">"}
와 동일하게 관련되어 있습니다 -vOFS=""
. 내 기여는 이 버전을 사용하면 레코드의 헤더와 길이를 지정할 수 있으므로 레코드를 계산할 필요가 없다는 것입니다.