Intereting Posts
как экспортировать все номера, которые уникальны в нескольких текстовых файлах в другой файл? Обучение в среде программирования Unix IPTABLES: обрабатывать пакет локально и отправлять копию другому хосту После создания предупреждения .deb: dpkg: warning при удалении каталог / usr / local / bin не пуст, поэтому не удаляется Compiz & XFCE – несогласие с количеством рабочих областей / кубических лиц Как я могу аутентифицироваться с помощью ключевого файла при использовании ssh-copy-id? Установка ОС в каталог Настроить кнопку питания для выключения на Debian Ошибка MAC OS X lion mac spoofing Как остановить tmux, фиксируя последовательности клавиш? Cifs монтирует общий доступ к Windows Как захватить IP-адрес клиентов на мой сервер через обратный туннель ssh. Запрос Bash на запись в каждый каталог под некоторым путем и запуск команды, когда он внутри? Загрузите файл iso через uEFI, вызвав исполняемый файл EFI внутри iso Проблемы с ncurses-devel в SuSE Linux Enterprise Desktop 11

awk – пропустить первую строку записи

Я проверил разные потоки, но не смог найти решение моей проблемы. У меня есть файл, содержащий строку букв A, T, C, G (представляющих последовательности ДНК) следующим образом:

$ cat species_gene >genus_1_species_1 TTGGATATTGAGTTACATACATATGATTTGGGAATGGAGAACCGAGATAAGACTGAAGATCAAGTCACAATTGATTGTGC TAATGCTGTCAAGAAATACAATGTCGGCATCAAATGTGCAACTATTACTCCTGATGAAAATCGAGTTGAGGAGTTCAAGC >tribe_1_species_1 CTGGATATAGAGTTGCACACATACGATCTGGGAATGGAAAACCGCGACAAGACTGATGACCAAGTCACAATCGATTGCGC CAACGCGATTAAAAAATACAACGTTGGAATTAAGTGCGCGACCATCACTCCCGACGAGAAGAGAGTCGAGGAATTCAAGC >species_2 CTTGATATTGAACTACACACCTATGATTTGGGAATGGAATACCGCGATAAAACTGATGACCAAGTCACAATTGACTGCGC KAATGCTATTAAGAAATACAATGTTGGTATTAAGTGCGCTACCATAACTCCAGATGAAAAAAGAGTTGAAGAATTCAAAC 

Я хотел бы подсчитать количество букв в строках, следующих за заголовком «> genus_1_species_1», до следующего заголовка. В этом случае длина следующих строк, равная 160:

TTGGATATTGAGTTACATACATATGATTTGGGAATGGAGAACCGAGATAAGACTGAAGATCAAGTCACAATTGATTGTGC TAATGCTGTCAAGAAATACAATGTCGGCATCAAATGTGCAACTATTACTCCTGATGAAAATCGAGTTGAGGAGTTCAAGC

Я хотел бы использовать awk и использовать «>» как разделитель записи и разрывы строк как разделитель полей, а затем подсчитывать количество полей (то есть строк), начиная со второй строки записи. Я использовал следующую команду:

 $ awk 'BEGIN {RS=">"} NR==2 {print length}' species_gene 

Я получил 180 (количество символов первой записи). Выход, который я хотел бы получить, равен 160 (длина первой записи, начиная со второй строки). Я попробовал следующий, чтобы отбросить заголовок:

 $ awk 'BEGIN {RS=">"; FS="\n"} NR==2 {if (NF!=1) {length}}' species_gene 

Я кое-что не получу здесь, и я был бы рад, если бы кто-то помог мне.

ИМХО было бы естественным использовать пустую строку в качестве разделителя записей. В этом «режиме абзаца» awk включает в себя новые строки как разделители полей, поэтому в вашем случае каждая строка записи становится полем. Затем вы можете удалить первое поле, назначив ему пустую строку; это имеет хороший побочный эффект для повторной оценки всей записи с заданным разделителем выходных полей: путем установки этого в пустую строку, остальные поля объединяются. Затем вы можете просто напечатать длину записи.

 awk 'BEGIN {RS="";OFS=""} NR==1 {$1=""; print length}' species_gene 

Тестирование с помощью вашего ввода

 $ awk 'BEGIN {RS="";OFS=""} NR==1 {$1=""; print length}' species_gene 160 

length – это не только переменная в Awk, но и функция:

 $ awk 'BEGIN {RS=">"} NR==2 {print length($2) + length($3)}' species_gene 160 

Вот и все: добавьте длины двух полей, а не длину всей записи.

Короче:

 $ awk 'BEGIN {RS=">"} NR==2 {print length($2 $3)}' species_gene 160 

Столь же длинный:

 $ awk 'BEGIN {RS=">"} NR==2 && $0 = length($2 $3)' species_gene 160 

Возможное незначительное улучшение по сравнению с вашим улучшением ответа steeldriver :

 awk -vRS=">" -vOFS="" '$1=="genus_1_species_1" {$1=""; print length;}' species_gene 

Значение -vRS=">" эквивалентно BEGIN {RS=">"} , а также с -vOFS="" . Мой вклад в том, что эта версия позволяет указать заголовок записи, длина которой не требуется, поэтому вам не нужно подсчитывать записи.