Лучше использовать tput
, который будет обрабатывать escape-символы в зависимости от возможностей вывода/терминала. (Если терминал не может интерпретировать \e[*
цветовые коды, он будет «загрязнен», что затруднит чтение вывода. (Или иногда, если вы grep
такой вывод, вы увидите эти \e[*
в результатах)
См. этот учебник для tput
,
Вы можете написать:
blue=$( tput setaf 4 ) ;
normal=$( tput sgr0 ) ;
echo "hello ${blue}blue world${normal}" ;
Вот учебник, чтобы напечатать цветные часы в терминале
Также обратите внимание, что tput
может по-прежнему печатать escape-символ при перенаправлении STDOUT в файл:
$ myColoredScript.sh > output.log ;
# Problem: output.log will contain things like "^[(B^[[m"
Чтобы этого не произошло, настройте свой tput
переменные, подобные предложенным в этом решении.
Перл спешит на помощь
perl -laF/-/ -ne '
if (/^>/) { print; $header = "$_\_2"; }
else { print join "\n", $F[0], $header, $F[1] }
' -- input-file
-n
считывает ввод построчно -l
удаляет новые строки из ввода и добавляет их к операторам print
-aF/-/
разделяет вход на-
При чтении строки заголовка он выводит ее и сохраняет заголовок для последующего использования. При обработке последовательности он печатает первую часть, сохраненный заголовок и вторую часть.
Поскольку вы специально спрашивали об «использовании awk»
awk -F- '
/^>/ {hdr=$0; next}
{print hdr ORS $1; for(i=2;i<=NF;i++) print hdr"_"i ORS $i}
' file
Если вы хотите помочь себе, но не хотите изучать программирование, вы можете сделать что-то подобное с sed
. Вы просто всегда читаете следующую строку с N
, разделяете двойную строку -на части, окруженные ()
, и объединяете те части, которые называются \1
, для первой и так далее по мере необходимости:
sed -E 'N;s/(.*)(\n)(.*)-(.*)/\1\2\3\2\1_2\2\4/' file
Вы также можете сделать это без расширенных регулярных выражений (без вариантов -E
), но вы можете потеряться в обратной косой черте:
sed 'N;s/\(.*\)\(\n\)\(.*\)-\(.*\)/\1\2\3\2\1_2\2\4/' file
Тот же результат, достигнутый при использовании буфера удержания, но не столь очевидный, если вы новичок вsed
:
sed 'h;n;y/-/\n/;P;s/.*\n//;x;s/$/_2/;G' file
Захват строк, которые начинаются с >
в header
и переходят к входной записи next
для дальнейшей обработки. Затем напечатайте строку с header
a \n
и столбцом 1 новой входной записи . Затем повторите это для второго столбца и добавьте 2 в заголовок.
$ awk -F- '/^>/{header=$0; next}{print header ORS $1; print header"_2" ORS $2}' file
>M03117:162:000000000-ATLWF:1:1114:22047:12565:307
TCCGAAAGT
>M03117:162:000000000-ATLWF:1:1114:22047:12565:307_2
ACAACGTGT
>M03117:162:000000000-ATLWF:1:2104:9367:8166:307
TTCGAAAGTT
>M03117:162:000000000-ATLWF:1:2104:9367:8166:307_2
GGTGAGGTGTGGG
>M03117:162:000000000-ATLWF:1:1119:11492:8271:307
TCCGAAAGTTCTCCGA
>M03117:162:000000000-ATLWF:1:1119:11492:8271:307_2
CTTGGCTTCCTAG
>M03117:162:000000000-ATLWF:1:2111:19039:8200:307
GACGAAAGTTCACCGATA
>M03117:162:000000000-ATLWF:1:2111:19039:8200:307_2
GAGGTAGAAGGTGCAGTGGGGA