Как напечатать специальную строку?

У меня есть файл со следующим содержимым:

NC_014378.1 Protein Homology    CDS 192004  192117  .   +   0   ID=cds185;Parent=gene211;Dbxref=Genbank:WP_013277182.1;Name=WP_013277182.1;gbkey=CDS;inference=COORDINATES: similar to AA sequence:RefSeq:WP_005487032.1;product=50S ribosomal protein L36;protein_id=WP_013277182.1;transl_table=11
NC_014378.1 Protein Homology    CDS 1753871 1754437 .   +   0   ID=cds1636;Parent=gene1718;Dbxref=Genbank;Name=NP_013278608.1;gbkey=CDS;inference=COORDINATES: similar to AA sequence:RefSeq:NP_013278608.1;product=hypothetical protein;protein_id=NP_013278608.1;transl_table=11
NC_014378.1 Protein Homology    CDS 233759  235705  .   +   0   ID=cds226;Parent=gene252;Dbxref=Genbank;Name=RCSM;gbkey=CDS;inference=COORDINATES: similar to AA sequence:RefSeq:YP_013277222.1;product=methyl-accepting chemotaxis;transl_table=11
NC_014378.1 Protein Homology    CDS 486732  488687  .   +   0   ID=cds446;Parent=gene486;Dbxref=Genbank:WP_013277438.1;Name=WP_013277438.1;gbkey=CDS;inference=COORDINATES: similar to AA sequence:RefSeq:WP_013277438.1;product=methyl-accepting chemotaxis protein;protein_id=WP_013277438.1;transl_table=11

Я хочу получить следующий вывод

192004  192117  +  WP_013277182.1
1753871 1754437  +  NP_013278608.1
233759  235705  +  YP_013277222.1
486732  488687  +  WP_013277438.1

Какая команда unix будет использоваться.

-1
задан 3 May 2019 в 15:22

3 ответа

С GNU awk:

awk '{print $5,$6,$8,gensub(/.*([NWY]P_[^;]+).*/,"\\1",1)}'

Это печатает (разделенные от пробела) поля 5, 6, 8 и первую строку, начинающуюся “N”, “W” или “Y”, сопровождаемый “P _” вплоть до следующей точки с запятой от текущей строки.

Если Вы хотите другого Выходного Разделителя полей, заменяете переменную OFS в НАЧАТЬ блоке, например, для двух использования пробелов:

awk 'BEGIN{OFS="  "}{print $5,$6,$8,gensub(/.*([NWY]P_[^;]+).*/,"\\1",1)}'

Если Вы хотите выровненные значения OFS="\t" поскольку разделенные от вкладки столбцы являются хорошим выбором.

Если Вы не можете использовать GNU awk можно использовать match() и substr() функции для замены gensub():

awk 'match($0,/[NWY]P_[^;]+/){print $5,$6,$8,substr($0,RSTART,RLENGTH)}'

Объяснения

  • print $5,$6,$8 – распечатайте эти поля, разделенные OFS
  • gensub(/.*([NWY]P_[^;]+).*/,"\\1",1) – на целой текущей строке (по умолчанию), замене .*([NWY]P_[^;]+).* с тем, что сохраняется в группе 1 ("\\1"), однажды. .*([NWY]P_[^;]+).* соответствует целой строке, сохраняющей первую строку, состоящую из “N”, “W” или “Y”, сопровождаемого “P _” и по крайней мере один символ, который не является “”; ([^;]+, поскольку regex являются жадными, это соответствует всему до первой точки с запятой) как группа.
  • match($0,/[NWY]P_[^;]+/) – поиск $0 (= целая строка) для первого соответствия [NWY]P_[^;]+ (см. выше), и установите RSTART переменная к ее индексу и RLENGTH переменная к ее счетчику символов.
  • substr($0,RSTART,RLENGTH) – от $0, извлеките строку, запускающуюся в индексе RSTART с длиной RLENGTH

Пример выполняется

$ cat YP 
NC_014378.1 Protein Homology    CDS 192004  192117  .   +   0   ID=cds185;Parent=gene211;Dbxref=Genbank:WP_013277182.1;Name=WP_013277182.1;gbkey=CDS;inference=COORDINATES: similar to AA sequence:RefSeq:WP_005487032.1;product=50S ribosomal protein L36;protein_id=WP_013277182.1;transl_table=11
NC_014378.1 Protein Homology    CDS 1753871 1754437 .   +   0   ID=cds1636;Parent=gene1718;Dbxref=Genbank;Name=NP_013278608.1;gbkey=CDS;inference=COORDINATES: similar to AA sequence:RefSeq:NP_013278608.1;product=hypothetical protein;protein_id=NP_013278608.1;transl_table=11
NC_014378.1 Protein Homology    CDS 233759  235705  .   +   0   ID=cds226;Parent=gene252;Dbxref=Genbank;Name=RCSM;gbkey=CDS;inference=COORDINATES: similar to AA sequence:RefSeq:YP_013277222.1;product=methyl-accepting chemotaxis;transl_table=11
NC_014378.1 Protein Homology    CDS 486732  488687  .   +   0   ID=cds446;Parent=gene486;Dbxref=Genbank:WP_013277438.1;Name=WP_013277438.1;gbkey=CDS;inference=COORDINATES: similar to AA sequence:RefSeq:WP_013277438.1;product=methyl-accepting chemotaxis protein;protein_id=WP_013277438.1;transl_table=11
$ <YP awk '{print $5,$6,$8,gensub(/.*([NWY]P_[^;]+).*/,"\\1",1)}'
192004 192117 + WP_013277182.1
1753871 1754437 + NP_013278608.1
233759 235705 + YP_013277222.1
486732 488687 + WP_013277438.1
2
ответ дан 3 May 2019 в 15:22

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

perl -naE 'say "$F[4] $F[5] $F[7] ", /([NWY]P_.*?);/'
  • perl -naE для каждой строки, разбитых на поля и ...
  • say "$F[4] $F[5] $F[7] ", /([NWY]P_.*?);/ ... и распечатать 4, 5, 7 и регулярное выражение
0
ответ дан 3 May 2019 в 15:22

С помощью sed:

sed -E 's/.*CDS //;s/ *\. //;s/ 0.*([NWY]P_[^;]+).*/\1/'

Пояснения

  • s/.*CDS // - s заменить строку «CDS» и все (в текущей обрабатываемой строке) перед это без ничего - это удаляет начало строки
  • s/ *\. // - заменяет ноль или более пробелов, за которыми следует точка, за которой ничего не стоит - это удаляет столбец точек и его пробелы
  • s/ 0.*([NWY]P_[^;]+).*/\1/ - заменить «0», за которым следует ноль или более символов, строка «N», «W» или «Y», за которой следует «P_», за которым следует хотя бы один символ, не являющийся точкой с запятой (сохранение этой строки в group), за которым следует ноль или более символов в сохраненной строке - это берет конец строки, извлекает первую строку WP и удаляет все остальное

Пример выполнения

$ <YP sed -E 's/.*CDS //;s/ *\. //;s/ 0.*([NWY]P_[^;]+).*/\1/'
192004  192117  +  WP_013277182.1
1753871 1754437  +  NP_013278608.1
233759  235705  +  YP_013277222.1
486732  488687  +  WP_013277438.1
0
ответ дан 3 May 2019 в 15:22

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

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