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

Я не могу прокомментировать ответ, потому что мне не хватает репутации, но мой муж сделал это обновление на Precise, и он полностью закрыл свою систему, и ему пришлось сделать полную переустановку. Поэтому мой совет будет, если вы используете Precise 12.04, не делайте этого обновления. Мы потратили часы, пытаясь восстановить его систему из-за этого.

Было бы здорово, если бы вместо простого размещения сообщения и кнопки установки в центре обновления они оставили ссылку, чтобы вы знали что это было.

7
задан 18 August 2017 в 22:50

12 ответов

Поскольку вы специально попросили решение sed (я бы не предлагал на самом деле делать это таким образом, но вы могли бы):

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

Первый вызов sed = file вставляет номера голой строки, затем второй украсит их, добавив строку >seq.

OTOH, если вы заранее знаете, что есть 770 строк, тогда вы можете сделать

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

, хотя это зависит от расширения GNU sed R:

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

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

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

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

На практике я, вероятно, использовал бы awk-решение @ John1024 или его эквивалент perl

perl -lpe 'print ">seq" . $.' file
13
ответ дан 22 May 2018 в 19:19
  • 1
    Хорошее умное использование sed. – John1024 18 August 2017 в 22:58
  • 2
    Отличный подход ... – Ravexina 18 August 2017 в 22:59
  • 3
    Спасибо steeldriver за ваше приятное объяснение, он также работал. Я попросил sed, потому что это команда, которую я знаю. – Idalia Rojas 18 August 2017 в 23:36

Поскольку вы специально попросили решение sed (я бы не предлагал на самом деле делать это таким образом, но вы могли бы):

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

Первый вызов sed = file вставляет номера голой строки, затем второй украсит их, добавив строку >seq.

OTOH, если вы заранее знаете, что есть 770 строк, тогда вы можете сделать

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

, хотя это зависит от расширения GNU sed R:

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

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

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

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

На практике я, вероятно, использовал бы awk-решение @ John1024 или его эквивалент perl

perl -lpe 'print ">seq" . $.' file
13
ответ дан 18 July 2018 в 08:18

Поскольку вы специально попросили решение sed (я бы не предлагал на самом деле делать это таким образом, но вы могли бы):

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

Первый вызов sed = file вставляет номера голой строки, затем второй украсит их, добавив строку >seq.

OTOH, если вы заранее знаете, что есть 770 строк, тогда вы можете сделать

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

, хотя это зависит от расширения GNU sed R:

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

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

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

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

На практике я, вероятно, использовал бы awk-решение @ John1024 или его эквивалент perl

perl -lpe 'print ">seq" . $.' file
13
ответ дан 24 July 2018 в 19:03

Ваша задача может быть выполнена с помощью 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
ответ дан 22 May 2018 в 19:19
  • 1
    Я собирался предложить awk – Panther 18 August 2017 в 22:51
  • 2
    @steeldriver Причина в том, что я просто смотрел на некоторый код c ++ & lt; grin & gt ;. Ваше предложение намного лучше. Ответ обновлен. – John1024 18 August 2017 в 22:54
  • 3
    Спасибо, Джон !, Он работал очень хорошо. Я боялся спросить, потому что думал, что это очень сомнительный вопрос. – Idalia Rojas 18 August 2017 в 23:31
  • 4
    Я согласен с тем, что awk является гораздо более подходящим инструментом для этого. Еще один пример того, что важно понимать, что нужно клиенту - не просто делать то, о чем они просят (см. Знаменитую цитату из Ford), если я попрошу своих клиентов, что они хотят, они скажут «более быстрая лошадь» и т. Д.). – Floris 19 August 2017 в 16:27
  • 5
    Для менее критического сценария Awk используйте { printf(">seq%d\n%s\n", NR, $0) }. – David Foerster 19 August 2017 в 21:12

Использование простой петли:

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
ответ дан 22 May 2018 в 19:19

Использование paste:

 paste -d '\n' <(seq -f '>seq%g' 1 4) file
seq -f '>seq%g' 1 4 записывает номера, разделенные символом новой строки, в stdout & lt; (...) - подстановка процесса paste объединяет соответствующую строку каждого файла, разделенная по разделителю -d '\n' устанавливает разделитель конкатенации в новую строку вместо закладки по умолчанию
0
ответ дан 22 May 2018 в 19:19
  • 1
    можете ли вы объяснить роль 1 4 в команде seq? – Floris 19 August 2017 в 16:28
  • 2
    Вы также можете использовать анонимный канал вместо имени FIFO (для немного лучшей производительности или если ваша оболочка не поддерживает замещение процесса): seq -f '>seq%g' 1 4 | paste -d '\n' - file – David Foerster 3 September 2017 в 23:37

Использование простой петли:

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
ответ дан 18 July 2018 в 08:18

Использование paste:

paste -d '\n' <(seq -f '>seq%g' 1 4) file seq -f '>seq%g' 1 4 записывает номера, разделенные символом новой строки, в stdout & lt; (...) - подстановка процесса paste объединяет соответствующую строку каждого файла, разделенная по разделителю -d '\n' устанавливает разделитель конкатенации в новую строку вместо закладки по умолчанию
0
ответ дан 18 July 2018 в 08:18

Ваша задача может быть выполнена с помощью 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
ответ дан 18 July 2018 в 08:18

Использование простой петли:

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
ответ дан 24 July 2018 в 19:03

Использование paste:

paste -d '\n' <(seq -f '>seq%g' 1 4) file seq -f '>seq%g' 1 4 записывает номера, разделенные символом новой строки, в stdout & lt; (...) - подстановка процесса paste объединяет соответствующую строку каждого файла, разделенная по разделителю -d '\n' устанавливает разделитель конкатенации в новую строку вместо закладки по умолчанию
0
ответ дан 24 July 2018 в 19:03
  • 1
    можете ли вы объяснить роль 1 4 в команде seq? – Floris 19 August 2017 в 16:28
  • 2
    Вы также можете использовать анонимный канал вместо имени FIFO (для немного лучшей производительности или если ваша оболочка не поддерживает замещение процесса): seq -f '>seq%g' 1 4 | paste -d '\n' - file – David Foerster 3 September 2017 в 23:37

Ваша задача может быть выполнена с помощью 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
ответ дан 24 July 2018 в 19:03
  • 1
    Я собирался предложить awk – Panther 18 August 2017 в 22:51
  • 2
    @steeldriver Причина в том, что я просто смотрел на некоторый код c ++ & lt; grin & gt ;. Ваше предложение намного лучше. Ответ обновлен. – John1024 18 August 2017 в 22:54
  • 3
    Спасибо, Джон !, Он работал очень хорошо. Я боялся спросить, потому что думал, что это очень сомнительный вопрос. – Idalia Rojas 18 August 2017 в 23:31
  • 4
    Я согласен с тем, что awk является гораздо более подходящим инструментом для этого. Еще один пример того, что важно понимать, что нужно клиенту - не просто делать то, о чем они просят (см. Знаменитую цитату из Ford), если я попрошу своих клиентов, что они хотят, они скажут «более быстрая лошадь» и т. Д.). – Floris 19 August 2017 в 16:27
  • 5
    Для менее критического сценария Awk используйте { printf(">seq%d\n%s\n", NR, $0) }. – David Foerster 19 August 2017 в 21:12

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

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