Как вам это решение?:
sed -i -E -e "s/(Original|Reversal).*</\1$(sed '1q;d' file.txt)</" -e 's/C[0-9]*//' file.xml
text="$(cat foo)" && echo "$text" \
| sed -E -e "s/(Original|Reversal).*</\1$(sed '2q;d' file.txt)</" -e 's/C[0-9]*//' >> file.xml
Найдите шаблон Origina|Reversal
до <
sed -i -E -e "s/(Original|Reversal).*</
Заменить первой строкойfile.txt
/\1$(sed '1q;d' file.txt)</" -e 's/C[0-9]*//' file.xml
Скопируйте содержимое файла xml и повторите операцию, на этот раз со второй строкой file.txt
и добавьте вывод в файл xml
text="$(cat foo)" && echo "$text" \
| sed -E -e "s/(Original|Reversal).*</\1$(sed '2q;d' file.txt)</" -e 's/C[0-9]*//' >> file.xml
Пропустить флаг -w
до grep
, так как это ограничивает поиск соответствием на границах слов , как определеноgrep
(из документов, «Выбирать только те строки, содержащие совпадения, которые образуют целое слова».). Эта команда выдает ожидаемый результат:
cat > GCA_900659725.1_ASM90065972v1_genomic.gff <<EOF
CAACVG010000001.1 EMBL region 1 15202. +. ID=CAACVG010000001.1:1..15202;Dbxref=taxon:64391;gbkey=Src;mol_type=genomic DNA;note=contig: 10000|quiver
CAACVG010000001.1 EMBL gene 4526 9821. -. ID=gene-CALMAC_LOCUS1;Name=CALMAC_LOCUS1;gbkey=Gene;gene_biotype=protein_coding;locus_tag=CALMAC_LOCUS1
EOF
cat > upregulated_genes_in_BEg <<EOF
LOCUS1
LOCUS10095
EOF
grep -f upregulated_genes_in_BEg GCA_900659725.1_ASM90065972v1_genomic.gff
Печать:
CAACVG010000001.1 EMBL gene 4526 9821. -. ID=gene-CALMAC_LOCUS1;Name=CALMAC_LOCUS1;gbkey=Gene;gene_biotype=protein_coding;locus_tag=CALMAC_LOCUS1
Если вам нужен точный контроль над границами слов, возможно, этот лайнер Perl one -будет лучшим выбором:
perl -lne 'BEGIN { @upregulated_genes_in_BEg = `cat upregulated_genes_in_BEg`; %is_upregulated_gene_in_BEg = map { $s = $_; chomp $s; ( $s => 1 ) } @upregulated_genes_in_BEg; } ( $gene ) = m{(LOCUS\w+)}; print if $is_upregulated_gene_in_BEg{ $gene }; ' GCA_900659725.1_ASM90065972v1_genomic.gff
Один -лайнер считывает содержимое файла с активированными генами в хэш. Затем он использует этот хеш для поиска, содержит ли хэш слово LOCUS...
в текущей строке. Если в хеше есть слово, печатается строка.
Оболочка Perl one -использует эти флаги командной строки:-e
:Указывает Perl искать код в строке -, а не в файле. -n
:Перебирать ввод по одной строке за раз, назначая его на $_
по умолчанию. -l
:Удалите разделитель входных строк("\n"
на *NIX по умолчанию )перед выполнением кода в строке -и добавьте его при печати.
СМ. ТАКЖЕ:perldoc perlrun
:как запустить интерпретатор Perl :переключатели командной строкиperldoc perlre
:Perl регулярные выражения (регулярные выражения)perldoc perlre
:Perl регулярные выражения (регулярные выражения ):Квантификаторы; Классы персонажей и другие специальные побеги; утверждения; Группы захватаperldoc perlrequick
:Быстрое начало работы с регулярными выражениями Perl