Как добавить \n + ">" и числовой заголовок для разделения строк через каждые 200 символов?

Как сказал ilkkachu, это проблема не bash, а эмулятора терминала, который на выходе преобразует табуляцию в пробелы.

Проверка различных терминалов: putty, xterm и konsole преобразуют табуляцию в пробелы, а терминал urxvt и gnome -— нет. Итак, еще одно решение - переключить терминалы.

1
09.12.2020, 23:34
4 ответа

Возможным решением, позволяющим избежать потенциально тяжелых синтаксических анализаторов и регулярных выражений, является следующий конвейер, который должен работать на каждой системе UNIX, поскольку он использует только функции POSIX с опцией XSI:

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, который добавляет символ >перед числом.

0
18.03.2021, 22:43

С GNUawk:

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
0
18.03.2021, 22:43

С GNU awk для мульти -char RS и RT:

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

С помощью perlвы можете инициализировать RS значением \200 для чтения 200 байтов за раз. Предполагая, что ваш файл имеет символы, такие же, как байты.

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

Теги

Похожие вопросы