簡體   English   中英

將帶有任意換行符的文本重新格式化為等長的行

[英]Reformat text with arbitrary newlines into rows of equal length

抱歉,這可能是一個非常基本的問題 - 看起來應該很簡單,但我就是想不通。

我正在嘗試編寫一個 function,給定一個 stream 的字母字符和任意間隔的換行符(實際上,這意味着原始或 FASTA 格式的核苷酸序列),生成一個 stream,它在內容方面是相同的,但有一個換行符正好每五十個字符。 也就是說,如果我向它提供以下輸入(大腸桿菌U 5/41 的 16S rRNA 基因序列,具有與 FASTA 兼容的行長度):

AGTTTGATCATGGCTCAGATTGAACGCTGGCGGCAGGCCTAACACATGCAAGTCGAACGGTAACAGGAAG
CAGCTTGCTGCTTTGCTGACGAGTGGCGGACGGGTGAGTAATGTCTGGGAAACTGCCTGATGGAGGGGGA
TAACTACTGGAAACGGTAGCTAATACCGCATAACGTCGCAAGCACAAAGAGGGGGACCTTAGGGCCTCTT
GCCATCGGATGTGCCCAGATGGGATTAGCTAGTAGGTGGGGTAACGGCTCACCTAGGCGACGATCCCTAG
CTGGTCTGAGAGGATGACCAGCAACACTGGAACTGAGACACGGTCCAGACTCCTACGGGAGGCAGCAGTG
GGGAATATTGCACAATGGGCGCAAGCCTGATGCAGCCATGCNGCGTGTATGAAGAAGGCCTTCGGGTTGT
AAAGTACTTTCAGCGGGGAGGAAGGGAGTAAAGTTAATACCTTTGCTCATTGACGTTACCCGCAGAAGAA
GCACCGGCTAACTCCGTGCCAGCAGCCGCGGTAATACGGAGGGTGCAAGCGTTAATCGGAATTACTGGGC
GTAAAGCGCACGCAGGCGGTTTGTTAAGTCAGATGTGAAATCCCCGGGCTCAACCTGGGAACTGCATCTG
ATACTGGCAAGCTTGAGTCTCGTAGAGGGGGGTAGAATTCCAGGTGTAGCGGTGAAATGCGTAGAGATCT
GGAGGAATACCGGTGGCGAAGGCGGCCCCCTGGACGAAGACTGACGCTCAGGTGCGAAAGCGTGGGGAGC
AAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGTCGACTTGGAGGTTGTGCCCTTGAGGCG
TGGCTTCCGGANNTAACGCGTTAAGTCGACCGCCTGGGGAGTACGGCCGCAAGGTTAAAACTCAAATGAA
TTGACGGGGGCCGCACAAGCGGTGGAGCATGTGGTTTAATTCGATGCAACGCGAAGAACCTTACCTGGTC
TTGACATCCACGGAAGTTTTCAGAGATGAGAATGTGCCTTCGGGAACCGTGAGACAGGTGCTGCATGGCT
GTCGTCAGCTCGTGTTGTGAAATGTTGGGTTAAGTCCCGCAACGAGCGCAACCCTTATCCTTTGTTGCCA
GCGGTCCGGCCGGGAACTCAAAGGAGACTGCCAGTGATAAACTGGAGGAAGGTGGGGATGACGTCAAGTC
ATCATGGCCCTTACGACCAGGGCTACACACGTGCTACAATGGCGCATACAAAGAGAAGCGACCTCGCGAG
AGCAAGCGGACCTCATAAAGTGCGTCGTAGTCCGGATTGGAGTCTGCAACTCGACTCCATGAAGTCGGAA
TCGCTAGTAATCGTGGATCAGAATGCCACGGTGAATACGTTCCCGGGCCTTGTACACACCGCCCGTCACA
CCATGGGAGTGGGTTGCAAAAGAAGTAGGTAGCTTAACTTCGGGAGGGCG

以下輸入(完整的序列):

AGTTTGATCATGGCTCAGATTGAACGCTGGCGGCAGGCCTAACACATGCAAGTCGAACGGTAACAGGAAGCAGCTTGCTGCTTTGCTGACGAGTGGCGGACGGGTGAGTAATGTCTGGGAAACTGCCTGATGGAGGGGGATAACTACTGGAAACGGTAGCTAATACCGCATAACGTCGCAAGCACAAAGAGGGGGACCTTAGGGCCTCTTGCCATCGGATGTGCCCAGATGGGATTAGCTAGTAGGTGGGGTAACGGCTCACCTAGGCGACGATCCCTAGCTGGTCTGAGAGGATGACCAGCAACACTGGAACTGAGACACGGTCCAGACTCCTACGGGAGGCAGCAGTGGGGAATATTGCACAATGGGCGCAAGCCTGATGCAGCCATGCGCGTGTATGAAGAAGGCCTTCGGGTTGTAAAGTACTTTCAGCGGGGAGGAAGGGAGTAAAGTTAATACCTTTGCTCATTGACGTTACCCGCAGAAGAAGCACCGGCTAACTCCGTGCCAGCAGCCGCGGTAATACGGAGGGTGCAAGCGTTAATCGGAATTACTGGGCGTAAAGCGCACGCAGGCGGTTTGTTAAGTCAGATGTGAAATCCCCGGGCTCAACCTGGGAACTGCATCTGATACTGGCAAGCTTGAGTCTCGTAGAGGGGGGTAGAATTCCAGGTGTAGCGGTGAAATGCGTAGAGATCTGGAGGAATACCGGTGGCGAAGGCGGCCCCCTGGACGAAGACTGACGCTCAGGTGCGAAAGCGTGGGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGTCGACTTGGAGGTTGTGCCCTTGAGGCGTGGCTTCCGGATAACGCGTTAAGTCGACCGCCTGGGGAGTACGGCCGCAAGGTTAAAACTCAAATGAATTGACGGGGGCCGCACAAGCGGTGGAGCATGTGGTTTAATTCGATGCAACGCGAAGAACCTTACCTGGTCTTGACATCCACGGAAGTTTTCAGAGATGAGAATGTGCCTTCGGGAACCGTGAGACAGGTGCTGCATGGCTGTCGTCAGCTCGTGTTGTGAAATGTTGGGTTAAGTCCCGCAACGAGCGCAACCCTTATCCTTTGTTGCCAGCGGTCCGGCCGGGAACTCAAAGGAGACTGCCAGTGATAAACTGGAGGAAGGTGGGGATGACGTCAAGTCATCATGGCCCTTACGACCAGGGCTACACACGTGCTACAATGGCGCATACAAAGAGAAGCGACCTCGCGAGAGCAAGCGGACCTCATAAAGTGCGTCGTAGTCCGGATTGGAGTCTGCAACTCGACTCCATGAAGTCGGAATCGCTAGTAATCGTGGATCAGAATGCCACGGTGAATACGTTCCCGGGCCTTGTACACACCGCCCGTCACACCATGGGAGTGGGTTGCAAAAGAAGTAGGTAGCTTAACTTCGGGAGGGCG

— 它應該是 output 以下內容(相同的序列,每 50 個字符/鹼基換行):

AGTTTGATCATGGCTCAGATTGAACGCTGGCGGCAGGCCTAACACATGCA
AGTCGAACGGTAACAGGAAGCAGCTTGCTGCTTTGCTGACGAGTGGCGGA
CGGGTGAGTAATGTCTGGGAAACTGCCTGATGGAGGGGGATAACTACTGG
AAACGGTAGCTAATACCGCATAACGTCGCAAGCACAAAGAGGGGGACCTT
AGGGCCTCTTGCCATCGGATGTGCCCAGATGGGATTAGCTAGTAGGTGGG
GTAACGGCTCACCTAGGCGACGATCCCTAGCTGGTCTGAGAGGATGACCA
GCAACACTGGAACTGAGACACGGTCCAGACTCCTACGGGAGGCAGCAGTG
GGGAATATTGCACAATGGGCGCAAGCCTGATGCAGCCATGCGCGTGTATG
AAGAAGGCCTTCGGGTTGTAAAGTACTTTCAGCGGGGAGGAAGGGAGTAA
AGTTAATACCTTTGCTCATTGACGTTACCCGCAGAAGAAGCACCGGCTAA
CTCCGTGCCAGCAGCCGCGGTAATACGGAGGGTGCAAGCGTTAATCGGAA
TTACTGGGCGTAAAGCGCACGCAGGCGGTTTGTTAAGTCAGATGTGAAAT
CCCCGGGCTCAACCTGGGAACTGCATCTGATACTGGCAAGCTTGAGTCTC
GTAGAGGGGGGTAGAATTCCAGGTGTAGCGGTGAAATGCGTAGAGATCTG
GAGGAATACCGGTGGCGAAGGCGGCCCCCTGGACGAAGACTGACGCTCAG
GTGCGAAAGCGTGGGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGC
CGTAAACGATGTCGACTTGGAGGTTGTGCCCTTGAGGCGTGGCTTCCGGA
TAACGCGTTAAGTCGACCGCCTGGGGAGTACGGCCGCAAGGTTAAAACTC
AAATGAATTGACGGGGGCCGCACAAGCGGTGGAGCATGTGGTTTAATTCG
ATGCAACGCGAAGAACCTTACCTGGTCTTGACATCCACGGAAGTTTTCAG
AGATGAGAATGTGCCTTCGGGAACCGTGAGACAGGTGCTGCATGGCTGTC
GTCAGCTCGTGTTGTGAAATGTTGGGTTAAGTCCCGCAACGAGCGCAACC
CTTATCCTTTGTTGCCAGCGGTCCGGCCGGGAACTCAAAGGAGACTGCCA
GTGATAAACTGGAGGAAGGTGGGGATGACGTCAAGTCATCATGGCCCTTA
CGACCAGGGCTACACACGTGCTACAATGGCGCATACAAAGAGAAGCGACC
TCGCGAGAGCAAGCGGACCTCATAAAGTGCGTCGTAGTCCGGATTGGAGT
CTGCAACTCGACTCCATGAAGTCGGAATCGCTAGTAATCGTGGATCAGAA
TGCCACGGTGAATACGTTCCCGGGCCTTGTACACACCGCCCGTCACACCA
TGGGAGTGGGTTGCAAAAGAAGTAGGTAGCTTAACTTCGGGAGGGCG

我為此編寫的代碼是:

void
output(char *seq, int len){
    for(int i = 0, j = 0; i < len; i++){
        if(seq[i] != '\n'){
                putc(seq[i], stdout);
                j++;
        }
        if(j % 50 == 0)
            putc('\n', stdout);
    }
    putc('\n', stdout);
}

如果輸入不包含換行符(上面的第二個示例),這將產生正確的預期結果。 但是,如果輸入包含換行符(上面的第一個示例),則 output 中包含無關的換行符:

AGTTTGATCATGGCTCAGATTGAACGCTGGCGGCAGGCCTAACACATGCA
AGTCGAACGGTAACAGGAAGCAGCTTGCTGCTTTGCTGACGAGTGGCGGA
CGGGTGAGTAATGTCTGGGAAACTGCCTGATGGAGGGGGATAACTACTGG
AAACGGTAGCTAATACCGCATAACGTCGCAAGCACAAAGAGGGGGACCTT
AGGGCCTCTTGCCATCGGATGTGCCCAGATGGGATTAGCTAGTAGGTGGG
GTAACGGCTCACCTAGGCGACGATCCCTAGCTGGTCTGAGAGGATGACCA
GCAACACTGGAACTGAGACACGGTCCAGACTCCTACGGGAGGCAGCAGTG

GGGAATATTGCACAATGGGCGCAAGCCTGATGCAGCCATGCGCGTGTATG
AAGAAGGCCTTCGGGTTGTAAAGTACTTTCAGCGGGGAGGAAGGGAGTAA
AGTTAATACCTTTGCTCATTGACGTTACCCGCAGAAGAAGCACCGGCTAA
CTCCGTGCCAGCAGCCGCGGTAATACGGAGGGTGCAAGCGTTAATCGGAA
TTACTGGGCGTAAAGCGCACGCAGGCGGTTTGTTAAGTCAGATGTGAAAT
CCCCGGGCTCAACCTGGGAACTGCATCTGATACTGGCAAGCTTGAGTCTC
GTAGAGGGGGGTAGAATTCCAGGTGTAGCGGTGAAATGCGTAGAGATCTG
GAGGAATACCGGTGGCGAAGGCGGCCCCCTGGACGAAGACTGACGCTCAG
GTGCGAAAGCGTGGGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGC
CGTAAACGATGTCGACTTGGAGGTTGTGCCCTTGAGGCGTGGCTTCCGGA


TAACGCGTTAAGTCGACCGCCTGGGGAGTACGGCCGCAAGGTTAAAACTC
AAATGAATTGACGGGGGCCGCACAAGCGGTGGAGCATGTGGTTTAATTCG
ATGCAACGCGAAGAACCTTACCTGGTCTTGACATCCACGGAAGTTTTCAG
AGATGAGAATGTGCCTTCGGGAACCGTGAGACAGGTGCTGCATGGCTGTC
GTCAGCTCGTGTTGTGAAATGTTGGGTTAAGTCCCGCAACGAGCGCAACC
CTTATCCTTTGTTGCCAGCGGTCCGGCCGGGAACTCAAAGGAGACTGCCA
GTGATAAACTGGAGGAAGGTGGGGATGACGTCAAGTCATCATGGCCCTTA
CGACCAGGGCTACACACGTGCTACAATGGCGCATACAAAGAGAAGCGACC
TCGCGAGAGCAAGCGGACCTCATAAAGTGCGTCGTAGTCCGGATTGGAGT
CTGCAACTCGACTCCATGAAGTCGGAATCGCTAGTAATCGTGGATCAGAA
TGCCACGGTGAATACGTTCCCGGGCCTTGTACACACCGCCCGTCACACCA
TGGGAGTGGGTTGCAAAAGAAGTAGGTAGCTTAACTTCGGGAGGGCG

我試過玩模數周圍的數字,但無濟於事。 我不確定為什么這會失敗。 我怎樣才能使這段代碼按預期運行?

只需將檢查new-break-lengthif條件移到里面。

您還可以限制使用本地查找表檢查允許的核苷酸。

在輸入中注意到三 (3) 個N Wiki Nucleotide - Abbreviation Codes ,表示any base (not a gap) ,但預期的 output 和你的錯誤 output 沒有它們。

#define LINE_BREAK_LEN  50
void
output (const char *seq, const int len) {
    char nlt [256] = {0};
    nlt ['A'] = nlt['G'] = nlt['C'] = nlt['T'] = nlt['U'] = 1;
    //nlt ['a'] = nlt['g'] = nlt['c'] = nlt['t'] = nlt['u'] = 1; // in case you want to allow lower-case too

    for (int i = 0, j = 0; i < len; i++) {
        if (nlt [(unsigned char) seq[i]]) {
            putc (seq[i], stdout);
            j++;
            if (0 == (j % LINE_BREAK_LEN))
                putc ('\n', stdout);
        }
    }
    putc ('\n', stdout);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM