Я должен изменить текстовый файл с 770 строками и добавить другой заголовок для каждого из них, например, у меня есть это:
CWGAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAG
ACACTCTTTCCCTACACGACGCTCTTCCGATCTAGGC
ACACTCTTTCCCTACACGACGCTCTTCCGATCTGATT
ACACTCTTTCCCTACACGACGCTCTTCCGATCTACCGT
И я хочу получить это:
>seq1
CWGAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAG
>seq2
ACACTCTTTCCCTACACGACGCTCTTCCGATCTAGGC
>seq3
ACACTCTTTCCCTACACGACGCTCTTCCGATCTGATT
>seq4
ACACTCTTTCCCTACACGACGCTCTTCCGATCTACCGT
Так как Вы конкретно попросили 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
Ваша задача может быть сделана с sed, но sed испытывает недостаток в любом собственном понимании арифметики, которая делает это неправильным инструментом. Awk работает хорошо:
$ awk '{print ">seq" NR} 1' file
>seq1
CWGAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAG
>seq2
ACACTCTTTCCCTACACGACGCTCTTCCGATCTAGGC
>seq3
ACACTCTTTCCCTACACGACGCTCTTCCGATCTGATT
>seq4
ACACTCTTTCCCTACACGACGCTCTTCCGATCTACCGT
, Как это работает:
print ">seq" NR
Для каждого чтения новой строки, мы сначала печатаем заголовок, который Вы хотите.
NR
счетчик строки awk.
1
Это - загадочное сокращение awk от печати строки.
Используя простой цикл:
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
Используя paste
:
paste -d '\n' <(seq -f '>seq%g' 1 4) file
seq -f '>seq%g' 1 4
записи разделенные от новой строки числа к stdoutpaste
, связывает соответствующую строку каждого файла, разделенного разделителем -d '\n'
наборы разделитель конкатенации к новой строке вместо вкладки