AWK에서는 여러 블록이 어떻게 작동하나요?

AWK에서는 여러 블록이 어떻게 작동하나요?

내가 우연히 만났어이 줄 스크립트고정 너비 텍스트 파일에서 줄 바꿈을 제거하는 데 사용됩니다. 아이디어는 다음과 같은 항목으로 가득 찬 파일을 변경하는 것입니다.

>IGHV1-18*01
CAGGTTCAGCTGGTGCAGTCTGGAGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAG
GTCTCCTGCAAGGCTTCTGGTTACACCTTTACCAGCTATGGTATCAGC
TGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGATCAGCGCTTAC
AATGGTAACACAAACTATGCACAGAAGCTCCAGGGCAGAGTCACCATGACCACA
GACACATCCACGAGCACAGCCTACATGGAGCTGAGGAGCCTGAGATCTGACGACACGGCC
GTGTATTACTGTGCGAGAGA

도착하다

>IGHV1-18*01
CAGGTTCAGCTGGTGCAGTCTGGAGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGTTACACCTTTACCAGCTATGGTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGATCAGCGCTTACAATGGTAACACAAACTATGCACAGAAGCTCCAGGGCAGAGTCACCATGACCACAGACACATCCACGAGCACAGCCTACATGGAGCTGAGGAGCCTGAGATCTGACGACACGGCCGTGTATTACTGTGCGAGAGA

저는 AWK에 대한 경험이 많지 않기 때문에 이를 시도하고 해석하는 것이 좋은 학습 경험이 될 것이라고 생각했습니다. 그러나 나는 어려움에 직면했습니다. 구체적으로, 여러 블록이 차례로 발생하는 경우 첫 번째 블록은 암시적인 for 루프입니까?

awk '/^>/ {printf("\n%s\n",$0);next; } { printf("%s",$0);}  END {printf("\n");}' < file.fa

답변1

그렇죠. 단지 그것은 암시적이지 않습니다. 실제로 형식은 다음과 같습니다.

/foo/{something}

어느 것이 동일합니까?

if(/foo/){something}

즉, 현재 줄이 일치하면 foo(귀하의 예에서는 일치하는 경우 >) 줄 바꿈, 현재 줄 및 다른 줄 바꿈을 인쇄합니다.

next첫 번째 블록이 실행되면 스크립트가 나머지 블록을 건너뛰고 다음 줄로 이동하는지 확인하세요 . oneliner는 다음과 같이 작성할 수도 있습니다.

awk '{
        if(/^>/){
            printf("\n%s\n",$0);
        }
        else{ 
            printf("%s",$0);
        }
        END {
                printf("\n");
        }' < file.fa

마지막으로 간단한 print호출이 awk개행을 추가하므로 위의 약간 더 간단한 버전을 사용할 수 있습니다.

awk '/^>/{print "\n"$0;next;}{printf("%s",$0);} END{print}' file.fa

답변2

awk는 한 줄씩 읽습니다. (블록이라고 생각할 수도 있지만 줄 바꿈이나 CR로 끝나는 줄입니다.)

그 코드를 풀어보자

awk '/^>/ {printf("\n%s\n",$0);next; } { printf("%s",$0);}  END {printf("\n");}'

에서 볼 수 있듯이 man awkawk 프로그램은 형식 /pattern/ { actions}이므로 프로그램은 다음과 같습니다.

  • /^>/ {printf("\n%s\n",$0);next; }

    • >( )로 /^>/시작하는 줄 의 경우
    • \nprintf("\n%s\n",$0)( )로 둘러싸인 줄을 인쇄합니다 .
    • next다음 awk 명령으로 이동하지 않고 다음 줄( )을 가져옵니다 .
  • { printf("%s",$0);}

    • 모든 패턴에 대해(패턴 절이 비어 있음)
    • 개행 없이 줄을 인쇄합니다( printf("%s",$0);)
  • END {printf("\n");}

    • 파일(들)의 끝 이후 ( END)
    • 줄 바꿈 인쇄( printf "\n" ;)

관련 정보