У меня есть файл со следующим содержимым:
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 будет использоваться.
С 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
– распечатайте эти поля, разделенные OFSgensub(/.*([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
Использование 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 и регулярное выражение С помощью 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