Как вставить другой заголовок для каждой строки с sed?

Я должен изменить текстовый файл с 770 строками и добавить другой заголовок для каждого из них, например, у меня есть это:

CWGAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAG
ACACTCTTTCCCTACACGACGCTCTTCCGATCTAGGC
ACACTCTTTCCCTACACGACGCTCTTCCGATCTGATT
ACACTCTTTCCCTACACGACGCTCTTCCGATCTACCGT

И я хочу получить это:

>seq1
CWGAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAG
>seq2
ACACTCTTTCCCTACACGACGCTCTTCCGATCTAGGC
>seq3
ACACTCTTTCCCTACACGACGCTCTTCCGATCTGATT
>seq4
ACACTCTTTCCCTACACGACGCTCTTCCGATCTACCGT
7
задан 18 August 2017 в 12:50

4 ответа

Так как Вы конкретно попросили sed решение (я не предложу на самом деле делать его этот путь - но Вы могли):

$ sed = file | sed '1~2 s/^/>seq/'
>seq1
CWGAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAG
>seq2
ACACTCTTTCCCTACACGACGCTCTTCCGATCTAGGC
>seq3
ACACTCTTTCCCTACACGACGCTCTTCCGATCTGATT
>seq4
ACACTCTTTCCCTACACGACGCTCTTCCGATCTACCGT

первый вызов sed = file вставляет пустые номера строки, затем второе украшает themby предварительное ожидание эти >seq строка.

<час>

OTOH, если Вы знаете заранее это, существуют 770 строк, затем Вы могли бы сделать

printf ">seq%d\n" {1..770} | sed 'R file'

, хотя это полагается на расширение GNU sed R:

имя файла R
Ставит строку в очередь имени файла, которое будет считано и вставлено в поток вывода в конце текущего цикла, или когда следующая входная строка читается. Обратите внимание, что, если имя файла не может быть считано, или если его конец достигнут, никакая строка не добавляется ни без какого ошибочного признака.

, Конечно, если Вы не знаете количество строк заранее, Вы могли делать

printf ">seq%d\n" $(seq 1 "$(wc -l < file)") | sed 'R file'

, но это потеряло бы преимущество только необходимости считать файл однажды.

<час>

На практике я, вероятно, использовал бы awk решение @John1024 или его жемчуг, эквивалентный

perl -lpe 'print ">seq" . $.' file
13
ответ дан 23 November 2019 в 06:07

Ваша задача может быть сделана с sed, но sed испытывает недостаток в любом собственном понимании арифметики, которая делает это неправильным инструментом. Awk работает хорошо:

$ awk '{print ">seq" NR} 1' file
>seq1
CWGAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAG
>seq2
ACACTCTTTCCCTACACGACGCTCTTCCGATCTAGGC
>seq3
ACACTCTTTCCCTACACGACGCTCTTCCGATCTGATT
>seq4
ACACTCTTTCCCTACACGACGCTCTTCCGATCTACCGT

, Как это работает:

  • print ">seq" NR

    Для каждого чтения новой строки, мы сначала печатаем заголовок, который Вы хотите.

    NR счетчик строки awk.

  • 1

    Это - загадочное сокращение awk от печати строки.

12
ответ дан 23 November 2019 в 06:07

Используя простой цикл:

count=1; while read -r line ; do printf '>seq%d\n%s\n' $((count++)) "$line"; done < file

вывод:

>seq1
CWGAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAG
>seq2
ACACTCTTTCCCTACACGACGCTCTTCCGATCTAGGC
>seq3
ACACTCTTTCCCTACACGACGCTCTTCCGATCTGATT
>seq4
ACACTCTTTCCCTACACGACGCTCTTCCGATCTACCGT
5
ответ дан 23 November 2019 в 06:07

Используя paste:

 paste -d '\n' <(seq -f '>seq%g' 1 4) file
  • seq -f '>seq%g' 1 4 записи разделенные от новой строки числа к stdout
  • < (...) замена процесса
  • paste, связывает соответствующую строку каждого файла, разделенного разделителем
  • -d '\n' наборы разделитель конкатенации к новой строке вместо вкладки
по умолчанию
0
ответ дан 23 November 2019 в 06:07

Другие вопросы по тегам:

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