изменять и управлять строками в файле с помощью awk

Лучше использовать 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переменные, подобные предложенным в этом решении.

1
20.08.2017, 06:55
4 ответа

Перл спешит на помощь

perl -laF/-/ -ne '
    if (/^>/) { print; $header = "$_\_2"; }
    else { print join "\n", $F[0], $header, $F[1] }
' -- input-file
  • -nсчитывает ввод построчно
  • -lудаляет новые строки из ввода и добавляет их к операторам print
  • -aF/-/разделяет вход на-

При чтении строки заголовка он выводит ее и сохраняет заголовок для последующего использования. При обработке последовательности он печатает первую часть, сохраненный заголовок и вторую часть.

1
27.01.2020, 23:14

Поскольку вы специально спрашивали об «использовании awk»

awk -F- '
  /^>/ {hdr=$0; next} 
  {print hdr ORS $1; for(i=2;i<=NF;i++) print hdr"_"i ORS $i}
' file
2
27.01.2020, 23:14

Если вы хотите помочь себе, но не хотите изучать программирование, вы можете сделать что-то подобное с 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
1
27.01.2020, 23:14

Захват строк, которые начинаются с >в headerи переходят к входной записи nextдля дальнейшей обработки. Затем напечатайте строку с headera \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
2
27.01.2020, 23:14

Теги

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