Добавить номер для каждого соответствующего шаблона в текстовом файле в bash

Здравствуйте, у меня есть файл, например

Файл.txt

>LO_D
AHAHAHAHHAHAH
>LEIO_DS
DHHDHDHDHDH
>LODJ_jdjd
DJDJHDHDHD
>LO_D
AAAAAAA
>LO_D
HHAHAHAHAHAH

Я хотел бы добавить число сразу после каждого элемента >LO_D

Затем я должен получить:

>LO_D_1
AHAHAHAHHAHAH
>LEIO_DS
DHHDHDHDHDH
>LODJ_jdjd
DJDJHDHDHD
>LO_D_2
AAAAAAA
>LO_D_3
HHAHAHAHAHAH

Я знаю, как использовать sed ex : sed -i 's@>LO_D@>LO_D_number@'g File.txt, но я не знаю, как включить числовую часть.

Grendel 20.12.2020 17:03

Пожалуйста, добавьте эту попытку, отредактировав свой вопрос

anubhava 20.12.2020 17:04
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
2
81
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать это awk:

awk '/^>LO_D$/ {$0 = $0 "_" (++n)} 1' file

>LO_D_1
AHAHAHAHHAHAH
>LEIO_DS
DHHDHDHDHDH
>LODJ_jdjd
DJDJHDHDHD
>LO_D_2
AAAAAAA
>LO_D_3
HHAHAHAHAHAH

Не могли бы вы попробовать следующее, написанное и протестированное с показанными образцами.

awk '$0= = ">LO_D"{print $0"_"++count;next} 1' Input_file

Объяснение: Добавлено подробное объяснение вышеизложенного.

awk '                  ##Starting awk program from here.
$0= = ">LO_D"{           ##Checking condition if line is >LO_D then do following.
  print $0"_"++count   ##Printing current line _ count variable with inreasing value.
  next                 ##next will skip all further statements from here.
}
1                      ##1 will print current line.
' Input_file           ##mentioning Input_file name here.
Ответ принят как подходящий

Используйте этот однострочный Perl:

perl -pe 's/^(>LO_D)$/"${1}_" . ++$i/e;' in.fasta

Однострочник Perl использует следующие флаги командной строки:
-e: говорит Perl искать код в строке, а не в файле.
-p : перебирать ввод по одной строке за раз, назначая его $_ по умолчанию. Добавляйте print $_ после каждой итерации цикла.

^(>LO_D)$ : сопоставьте литеральную строку >LO_D, которая начинается в начале строки (^) и заканчивается в конце строки ($). Захватите строку, используя круглые скобки, в переменную захвата $1.
"${1}_" . ++$i : строка замены, состоящая из захваченной переменной $1, за которой следует символ подчеркивания, за которым следует счетчик. Обратите внимание, что $1 записывается как ${1}, чтобы не интерпретироваться как несуществующая переменная $1_. Счетчик увеличивается на 1 перед вычислением выражения, так что счетчик равен 1, 2, 3 и т. д. при последующих совпадениях. s/PATTERN/REPLACEMENT/e : флаг /e говорит Perl сначала оценить REPLACEMENT как выражение, а затем выполнить подстановку.

СМОТРИТЕ ТАКЖЕ:
perldoc perlrun: как запустить интерпретатор Perl: переключатели командной строки
perldoc perlrequick: быстрое начало работы с регулярными выражениями Perl

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