저는 쉘 스크립팅을 처음 접했고 fasta 파일의 헤더 번호를 순차적으로 매기려고 합니다. 내 fasta 파일의 순서는 다음과 같습니다.
>Rodentia sp.
MALWILLPLLALLILWGPDPAQAFVNQHLCGSHLVEALYILVCGERGFFYTPMSRREVED
PQVGQVELGAGPGAGSEQTLALEVARQARIVQQCTSGICSLYQENYCN
>Ovis aries
MALWTRLVPLLALLALWAPAPAHAFVNQHLCGSHLVEALYLVCGERGFFYTPKARREVEG
PQVGALELAGGPGAGGLEGPPQKRGIVEQCCAGVCSLYQLENYCN
쉘 스크립트에서 awk를 사용하여 ">" 뒤에 1부터 n(n은 시퀀스 번호)까지 숫자를 삽입하여 헤더에 순차적으로 번호를 매기고 싶습니다. 그러면 시퀀스는 다음과 같습니다.
> 1 Rodentia sp.
MALWILLPLLALLILWGPDPAQAFVNQHLCGSHLVEALYILVCGERGFFYTPMSRREVED
PQVGQVELGAGPGAGSEQTLALEVARQARIVQQCTSGICSLYQENYCN
> 2 Ovis aries
MALWTRLVPLLALLALWAPAPAHAFVNQHLCGSHLVEALYLVCGERGFFYTPKARREVEG
PQVGALELAGGPGAGGLEGPPQKRGIVEQCCAGVCSLYQLENYCN
이를 위해 awk의 sub 함수를 사용해 ">"의 각 인스턴스를 ">[a number]"로 바꾸었습니다.
awk '/>/{sub(">", "> ++i ")}1' file
그러나 awk에서 sub 함수를 사용하여 변수를 증가시키는 방법을 이해하지 못합니다. sub 함수를 사용하여 이 작업을 수행할 수 있는 방법이 있는지 궁금합니다. sub가 어떻게 작동하는지 이해하지만 변수가 올바르게 증가하도록 선언하는 방법을 모르겠습니다.
쉘 스크립트 시작 부분에서 i를 1로 선언합니다.
i=1
그러나 하위 함수에서 얻은 출력은 다음과 같습니다.
> ++$i Rodentia sp.
> ++$i Ovis aries
awk sub 함수를 사용하여 제목에 번호를 매길 수 있도록 변수를 올바르게 선언하려면 어떻게 해야 합니까?
답변1
거의 다 끝났습니다. ++i
인용된 부분 문자열 외부에 있는 내용을 "> ++i"
가져가세요 "> " ++i
.
awk '/^>/{sub(">", "> "++i " ")}1' infile
답변2
αГsнιn이 지적했듯이, ++i
리터럴 문자열의 일부로 삽입됩니다.
더 예뻐 보일 수 있는 또 다른 솔루션:
awk -F '>' '/^>/ { $1 = "> " ++i } { print }' file.fa
{ print }
또는 약어 를 선호하는 경우
awk -F '>' '/^>/ { $1 = "> " ++i } 1' file.fa
이는 입력 필드 구분 기호로 사용되며 헤더 줄의 첫 번째 필드( >
비어 있는 입력의 이전 비트)를 원하는 문자열로 바꿉니다.>