Как сказал ilkkachu, это проблема не bash, а эмулятора терминала, который на выходе преобразует табуляцию в пробелы.
Проверка различных терминалов: putty, xterm и konsole преобразуют табуляцию в пробелы, а терминал urxvt и gnome -— нет. Итак, еще одно решение - переключить терминалы.
Возможным решением, позволяющим избежать потенциально тяжелых синтаксических анализаторов и регулярных выражений, является следующий конвейер, который должен работать на каждой системе 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
, который добавляет символ >
перед числом.
С 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
С GNU awk для мульти -char RS и RT:
$ awk -v RS='.{200}' 'RT{print ">" NR ORS RT}' file
>1
ATACAGTTGGGTTTGGTTGGATCTTCGTCGGTATTTTTATTGGGTTAATTCTCTGGTTTTTCATCAACCGCGCCAGCGTCAGAGCGAACAGGCAGGTTGAATTACTTGAGTCTATCGACCAGAAATTATCAAAAATAGTAGATCCAAACTTCGAGGCAAATAACAAAGACCAGTCGAAAGAAAACTACCTTGAAGAAGCA
>2
TGGGAAAACAGCATTCAGCGGTGGCTTATTCCTGCTAAGGATGTTGGCCGCATTCATGCTGAGCACAACCTCGACGGCCTGCTGAGGGGCGATTCGGCATCCCGCGCTGCCTTTATGAAGGCAATGGGAGAGGCAGGGCTACGCACCATCAACGAGATGCGACGAACGGACAACCTCCCGCCATTGCCGGGTGGCGATGT
>3
GAAATGGGAACCGCGAACATGCCTGCACATCCGTTTGTGCGACCCGCTTACGATACTCGCGAGGAAGAGGCCGCCAGCGTCGCCATTGCCAGGATGAATCAGGCTATTGATGAGGTATTGAGCAAGTGAATGAAGATAATATCTACGCCTTGCTTTCTCCCCTGGCAGAAGGACGGGTATATCCCTATGTTGCGCCATTA
С помощью perl
вы можете инициализировать RS значением \200 для чтения 200 байтов за раз. Предполагая, что ваш файл имеет символы, такие же, как байты.
$ perl -ne '
BEGIN { $/ = \200; $\ = "\n" }
chop if /\n/;
last if /^$/;
++$k; print s/^/>$k\n/r;
' file