Intereting Posts
Команда Unix для поиска слова в файле history – Список только успешно запускает команды ArchLinux, как настроить английский язык с помощью german keyboardlayout недавно созданный раздел отсутствует даже после partprobe, не показывает такого устройства или адреса PHP CLI и Bash – изменение поведения ключевого слова PHP Разница между initramfs.cpio и rootfs.cpio Загрузочный диск RAID не найден после обновления mdadm как редактировать данные автора для gitg? найти и конвейер grep ничего не возвращает Нужна помощь с сценарием командной строки сетевого администратора LXC: Разница в безопасности между корневыми и конечными пользователями, не имеющими привилегированных контейнеров? Почему я получаю разные разрешения при создании файла с другой группой и как его настроить? Поиск компьютера на базе ARM или MIPS (нетбук или аналогичный размер) для воспроизведения Использование Sandin Sandbox Как я могу заставить iconv заменить входной файл на преобразованный вывод?

Добавление символа в любую другую текстовую строку

У меня есть огромный (около 20G) текстовый файл, содержащий миллионы проходов (ака абзацы) с заголовками. Заголовки и параграфы всегда по одной строке, например,

Солнечный свет
Это солнечный день.
темнота
Пещера – это темное место.

Я пытаюсь придумать команду терминала, которая проходит через текст и добавляет '>' перед каждым заголовком, т. Е. Каждую строку с нечетным номером (строки 1, 3, 5, …), например,

> Солнечный свет
Это солнечный день.
> Тьма
Пещера – это темное место.

Есть идеи?

Если это имеет значение: приведенный выше текст был просто примером. Большинство заголовков – MD5, а затем последовательность ДНК («параграф»), например,

0002ebd9ca12d6b69dfc3066356fc299
CATTAACCATTGGATACCTTCGGGTATATCCCATCCGTGTCTACATACTCTTGTTGCTTTGGCAGGCCGTGGTCACACACTGTGGGCTATGCCTGCATGTGCCTGCCAGAGGACCA

… который я пытаюсь преобразовать в

> 0002ebd9ca12d6b69dfc3066356fc299
CATTAACCATTGGATACCTTCGGGTATATCCCATCCGTGTCTACATACTCTTGTTGCTTTGGCAGGCCGTGGTCACACACTGTGGGCTATGCCTGCATGTGCCTGCCAGAGGACCA

POSIXly:

 sed 's/^/>/;n' < file.in > file.out 

Другой ответ POSIX:

 paste -d'>\n' /dev/null - - <infile 

Он получает:

 >Sunshine This is a sunny day. >Darkness A cave is a dark place. 

Чтобы отредактировать каждую другую (ака каждая секунду) строку, начиная с первой, с помощью GNU sed , do

  sed '1 ~ 2s / ^ /> /' your_file 

Это напишет модифицированный файл на стандартный вывод. Т.е., если вы набираете только что выше, измененный файл будет отображаться на экране. Вы можете поместить это в новый файл, перенаправив вывод с помощью > ; например,

  sed '1 ~ 2s / ^ /> /' your_file > your_new_file 

или, если вы хотите изменить существующий файл, используйте -i :

  sed -i '1 ~ 2s / ^ /> /' your_file 
 sed '1,${s/^/>/g;n;n;n}' filename 

тестирование

 cat filename 'Sunshine 'This is a sunny day. 'Darkness 'A cave is a dark place 'Sunshine 'This is a sunny day. 'Darkness 'A cave is a dark place 'Sunshine 'This is a sunny day. 'Darkness 'A cave is a dark place 

После выполнения команды я получаю вывод как,

 sed '1,${s/^/>/g;n;n;n}' new >'Sunshine 'This is a sunny day. >'Darkness 'A cave is a dark place >'Sunshine 'This is a sunny day. >'Darkness 'A cave is a dark place >'Sunshine 'This is a sunny day. >'Darkness 'A cave is a dark place 

С awk вы можете попробовать что-то вроде:

 awk 'NR % 4 == 1 {sub(/^/,">")} {print}' filename 

Рекомендации

https://stackoverflow.com/questions/2099471/add-a-prefix-string-to-beginning-of-each-line

Без пустых строк между каждой строкой и символом «нет ' в начале:

 $ awk '{print ((NR%2)? ">":"") $0}' passages.txt 

дает:

 >Sunshine This is a sunny day. >Darkness A cave is a dark place. 

Кроме того, исходя из ваших ответов на все ответы здесь, ваш входной файл – это не отдельные строки с символом Line Feed в конце ( \n ). Возможно, стоит проверить его источник.

Вы можете использовать Vim в режиме Ex:

 ex -sc '%s/\v(.*\n){2}/> &/|x' file 
  1. % выбрать все строки

  2. s заменить

  3. \v включить магию

  4. x сохранить и закрыть