2012-07-17 4 views
2

다음과 같은 텍스트 파일이 있습니다. "A"와 "E"문자의 총 개수를 추출하고 싶습니다.awk를 사용하여 텍스트 파일에서 특정 문자 수를 추출하십시오.

>pr1 
FSVSQNNPAE 
>pr2 
MAKERAHSQ 
>pr3 
RRRDKINNWIVQL 

내가 AWK이 할 수있는 방법이

>pr1 
Total number of A - 1 
Total number of E - 1 

>pr2 
Total number of A – 2 
Total number of E - 1 

>pr3 
Total number of A – 0 
Total number of E – 0 

같은 출력을 얻을시겠습니까?

답변

4

편도. >으로 시작하는 줄이 발견되면 다음 문자를 읽어서 str 변수에 저장하고 각 문자의 대입 횟수를 계산하십시오.

awk ' 
    $1 ~ /^>/ { 
     getline str 
     num_a = gsub(/A/, "", str) 
     num_e = gsub(/E/, "", str) 
     printf "%s\nTotal number of A - %d\nTotal number of E - %d\n\n", $0, num_a, num_e 
    } 
' infile 

출력 :

>pr1                                                           
Total number of A - 1                                                       
Total number of E - 1                                                       

>pr2                                                           
Total number of A - 2                                                       
Total number of E - 1                                                       

>pr3                                                           
Total number of A - 0                                                       
Total number of E - 0 
+0

있었다 더 많거나 같은 생각은하지만,의 getline없이 ... –

+0

@Birei 매우 감사 적은. – user1510708

3

UPDATE :이 즉석에서 FS (field seperator)을 변경하여 작동합니다

{ 
    if ($0 ~ /^>/) 
    printf("\n%s\n", $0); 
    else 
    { 
    FS="A" 
    nl = $0; 
    $0 = nl; 
    print "Total number of A - ", NF-1; 

    FS="E" 
    $0 = nl; 
    print "Total number of E - ", NF-1; 
    } 
} 

을 제공합니다

>pr1 
Total number of A - 1 
Total number of E - 1 

>pr2 
Total number of A - 2 
Total number of E - 1 

>pr3 
Total number of A - 0 
Total number of E - 0 

이전 솔루션 : @에

{ 
    if ($1 ~ /^>/) 
    printf("\n%s\n", $0) 
    else 
    { 
    print "total number of A - ", gsub(/A/,"A") 
    print "total number of E - ", gsub(/E/,"E") 
    } 
} 

유사한 Birei의

+0

FS를 변경 한 이유는 무엇입니까? –

+0

@ KarlNordström 작업 솔루션 게시 됨 .. * 이것이 * FS로 가능하다는 것을 알았습니다. 그냥 순서를 올바르게 가져야했습니다. – Levon

+0

@ user1510708 실무 솔루션이 게시되었습니다 (업데이트) – Levon

관련 문제