200자마다 \n + ">" 및 숫자 헤더를 추가하여 줄을 구분하는 방법은 무엇입니까?

200자마다 \n + ">" 및 숫자 헤더를 추가하여 줄을 구분하는 방법은 무엇입니까?

연속된 시퀀스가 ​​있고 200자마다 \n 및 >를 추가하여 그룹을 구분하고 싶습니다. 나는 sed와 awk를 사용하는 것이 도움이 될 것이라고 생각하지만 나는 이것에 익숙하지 않습니다.

이것이 내 입력이 될 것입니다:

ATACAGTTGGGTTTGGTTGGATCTTCGTCGGTATTTTTATTGGGTTAATTCTCTGGTTTTTCATCAACCGCGCCAGCGTCAGAGCGAACAGGCAGGTTGAATTACTTGAGTCTATCGACCAGAAATTATCAAAAATAGTAGATCCAAACTTCGAGGCAAATAACAAAGACCAGTCGAAAGAAAACTACCTTGAAGAAGCATGGGAAAACAGCATTCAGCGGTGGCTTATTCCTGCTAAGGATGTTGGCCGCATTCATGCTGAGCACAACCTCGACGGCCTGCTGAGGGGCGATTCGGCATCCCGCGCTGCCTTTATGAAGGCAATGGGAGAGGCAGGGCTACGCACCATCAACGAGATGCGACGAACGGACAACCTCCCGCCATTGCCGGGTGGCGATGTGAAATGGGAACCGCGAACATGCCTGCACATCCGTTTGTGCGACCCGCTTACGATACTCGCGAGGAAGAGGCCGCCAGCGTCGCCATTGCCAGGATGAATCAGGCTATTGATGAGGTATTGAGCAAGTGAATGAAGATAATATCTACGCCTTGCTTTCTCCCCTGGCAGAAGGACGGGTATATCCCTATGTTGCGCCATTA

이것은 내 예상 결과입니다(> 쉼표 제외).

>1
ATACAGTTGGGTTTGGTTGGATCTTCGTCGGTATTTTTATTGGGTTAATTCTCTGGTTTTTCATCAACCGCGCCAGCGTCAGAGCGAACAGGCAGGTTGAATTACTTGAGTCTATCGACCAGAAATTATCAAAAATAGTAGATCCAAACTTCGAGGCAAATAACAAAGACCAGTCGAAAGAAAACTACCTTGAAGAAGCA
>2
TGGGAAAACAGCATTCAGCGGTGGCTTATTCCTGCTAAGGATGTTGGCCGCATTCATGCTGAGCACAACCTCGACGGCCTGCTGAGGGGCGATTCGGCATCCCGCGCTGCCTTTATGAAGGCAATGGGAGAGGCAGGGCTACGCACCATCAACGAGATGCGACGAACGGACAACCTCCCGCCATTGCCGGGTGGCGATGT
>3
GAAATGGGAACCGCGAACATGCCTGCACATCCGTTTGTGCGACCCGCTTACGATACTCGCGAGGAAGAGGCCGCCAGCGTCGCCATTGCCAGGATGAATCAGGCTATTGATGAGGTATTGAGCAAGTGAATGAAGATAATATCTACGCCTTGCTTTCTCCCCTGGCAGAAGGACGGGTATATCCCTATGTTGCGCCATTA

어떤 제안이 있으십니까? 미리 감사드립니다

ㅏ.

답변1

perlRS를 \200으로 초기화하여 한 번에 200바이트를 읽을 수 있습니다 . 파일에 바이트와 동일한 문자가 있다고 가정합니다.

$ perl -ne '
    BEGIN { $/ = \200; $\ = "\n" }
    chop if /\n/;
    last if /^$/;
    ++$k; print s/^/>$k\n/r;
' file

답변2

다중 문자 RS 및 RT에 GNU awk 사용:

$ awk -v RS='.{200}' 'RT{print ">" NR ORS RT}' file
>1
ATACAGTTGGGTTTGGTTGGATCTTCGTCGGTATTTTTATTGGGTTAATTCTCTGGTTTTTCATCAACCGCGCCAGCGTCAGAGCGAACAGGCAGGTTGAATTACTTGAGTCTATCGACCAGAAATTATCAAAAATAGTAGATCCAAACTTCGAGGCAAATAACAAAGACCAGTCGAAAGAAAACTACCTTGAAGAAGCA
>2
TGGGAAAACAGCATTCAGCGGTGGCTTATTCCTGCTAAGGATGTTGGCCGCATTCATGCTGAGCACAACCTCGACGGCCTGCTGAGGGGCGATTCGGCATCCCGCGCTGCCTTTATGAAGGCAATGGGAGAGGCAGGGCTACGCACCATCAACGAGATGCGACGAACGGACAACCTCCCGCCATTGCCGGGTGGCGATGT
>3
GAAATGGGAACCGCGAACATGCCTGCACATCCGTTTGTGCGACCCGCTTACGATACTCGCGAGGAAGAGGCCGCCAGCGTCGCCATTGCCAGGATGAATCAGGCTATTGATGAGGTATTGAGCAAGTGAATGAAGATAATATCTACGCCTTGCTTTCTCCCCTGGCAGAAGGACGGGTATATCCCTATGTTGCGCCATTA

답변3

잠재적으로 무거운 파서 및 정규식을 피할 수 있는 가능한 솔루션은 다음 파이프라인입니다. 이 파이프라인은 XSI 옵션과 함께 POSIX 기능만 사용하므로 모든 UNIX 시스템에서 작동해야 합니다.

tr -d '\n' | dd cbs=200 conv=unblock | nl -n ln | tr '\t' '\n' | paste -d '>\n' /dev/null - -

cat file |예를 들어 파일을 저장하기 위해 명령을 앞에 추가하여 파일을 표준 입력으로 공급해야 합니다 file.

이 명령은 후행 줄 바꿈을 제거하고 tr, 줄을 200바이트 청크로 나누고, 데이터 왼쪽의 숫자를 탭으로 분리하고, 각 줄에 번호를 매기고, 다음 명령을 사용하여 줄 바꿈으로 대체하고, 앞에 문자를 추가하여 출력을 친숙하게 만듭니다. 숫자 paste.>

답변4

GNU 사용 awk:

awk -v FPAT='.{200}' '{ while(++num<=NF) print ">"num RS $num; }' infile

위 명령은 줄이 항상 모듈로 200인 경우에만 작동합니다. 그렇지 않고 그보다 작거나 같으면 나머지 문자를 인쇄해야 하거나 줄도 200자 미만인 경우에 작동합니다.

awk -v FPAT='.{200}' '{ while(++num<=NF) print ">"num RS $num; };
END{
    if (length($0)%200)
        print ">" num RS substr($0, int(length($0)/200)*200+1, length($0)%200);
}' infile

관련 정보