내가 우연히 만났어이 줄 스크립트고정 너비 텍스트 파일에서 줄 바꿈을 제거하는 데 사용됩니다. 아이디어는 다음과 같은 항목으로 가득 찬 파일을 변경하는 것입니다.
>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 awk
awk 프로그램은 형식 /pattern/ { actions}
이므로 프로그램은 다음과 같습니다.
/^>/ {printf("\n%s\n",$0);next; }
>
( )로/^>/
시작하는 줄 의 경우\n
printf("\n%s\n",$0)
( )로 둘러싸인 줄을 인쇄합니다 .next
다음 awk 명령으로 이동하지 않고 다음 줄( )을 가져옵니다 .
{ printf("%s",$0);}
- 모든 패턴에 대해(패턴 절이 비어 있음)
- 개행 없이 줄을 인쇄합니다(
printf("%s",$0);
)
END {printf("\n");}
- 파일(들)의 끝 이후 (
END
) - 줄 바꿈 인쇄(
printf "\n" ;
)
- 파일(들)의 끝 이후 (