Intereting Posts
Удаленный ПК, доступный с помощью ssh, scp / rsync, не работает (больше) Сохранение файлов с потерянным фокусом в Vim Как включить список экземпляров Mint Linux Просмотр переменных цветов строк Почему поведение динамического DNS-динамика DHCP противоречиво? Преобразовать открытый ключ PEM в DER Где находится пакет ntpd на Ubuntu Wily (15.10) Инструкция unix awk begin Что случилось с моим разделом ext3 Изменить значение по умолчанию для Nautilus (file_manager) с «Забыть пароль немедленно»? Что такое хороший баланс между надежным паролем sudo и длительной задержкой Диспетчер Mint Display Manager говорит «g_key_file_free: assertion» key_file! NULL не удалось "после того, как я перестроил glib почему «timer_t» определяется в «time.h» в Linux, но не OS X Как создать файл и родительские каталоги в одной команде? Как запустить новую версию AIX в виртуальной машине с хостом Linux? Как правильно избежать этого слова на vim?

Удаление пустой строки и строки над ней

У меня большой файл .fna, содержащий миллионы последовательностей ДНК. Из-за некоторых ошибок записи после усечения моих праймеров я остался с некоторыми заголовками последовательностей без последовательности, следующей за ним. Пример показан ниже. Мне нужно удалить эти заголовки, а также пустые строки, чтобы я мог продолжить сценарии рабочего процесса.

B2S312_20116609 HWI-ST1128:217:D2HB4ACXX:8:1101:20814:45721 orig_bc=CCGCATAA new_bc=CCGCATAA bc_diffs=0 AACCATGCACCACCTGTATCTGTGTCTAACCAAAGGTCAGAACAACACAATCTCTTGTGTCCTCACAGTATGTCAAGACTT B4S315_20116610 HWI-ST1128:217:D2HB4ACXX:8:1101:20948:45746 orig_bc=ATATGCCG new_bc=ATATGCCG bc_diffs=0 AACCATGCACCACCTGCACACGACCAACTAAATGCCACCACATCTCTGCAGTGTCGCCGTGCATGTCAAGCCTT A3C214_20116611 HWI-ST1128:217:D2HB4ACXX:8:1101:20874:45747 orig_bc=GATCCAAC new_bc=GATCCAAC bc_diffs=0 A2C214_20116612 HWI-ST1128:217:D2HB4ACXX:8:1101:21248:45534 orig_bc=CCTAGGAT new_bc=CCTAGGAT bc_diffs=0 AACCGTGCACCACCTGTTTTCTGGCTTCCGAAGAAGAGGAACTATCTCTAGTTCTGTCCATCAATGTCAAGACCT 

Поэтому в этом примере я хотел бы удалить A3C214_20116611 HWI-ST1128:217:D2HB4ACXX:8:1101:20874:45747 orig_bc=GATCCAAC new_bc=GATCCAAC bc_diffs=0 и пустую строку под ней.

Мне удалось удалить только пустую строку с помощью sed, но не могу найти пример, подходящий для моего сценария.

 sed '$!N;/:.*\n$/d;P;D' <infile 

Вышеупомянутая команда втягивает строку N ext на каждую строку, которая есть ! а не $ last. Если он встречает пространство шаблонов, в котором находится : двоеточие, и последний символ является \n ewline, он удаляет лот. Это означает, что для строк, содержащих двоеточие, и следующая строка пустая, оба будут удалены. Для всех остальных это P доходит до первого появления \n ewline в пространстве шаблонов, тогда D eletes так же, прежде чем начинать с того, что остается. Это дает вам однострочный просмотр во всем файле.

(Для нижеприведенных решений я предполагаю, что вам нужна одна пустая строка для каждой строки заголовка + последовательности. Если вы этого хотите, сообщите мне, это легко сделать.)

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

 $ sed -rn 's/(.{106})/\n\1/p' file B2S312_20116609 HWI-ST1128:217:D2HB4ACXX:8:1101:20814:45721 orig_bc=CCGCATAA new_bc=CCGCATAA bc_diffs=0 AACCATGCACCACCTGTATCTGTGTCTAACCAAAGGTCAGAACAACACAATCTCTTGTGTCCTCACAGTATGTCAAGACTT B4S315_20116610 HWI-ST1128:217:D2HB4ACXX:8:1101:20948:45746 orig_bc=ATATGCCG new_bc=ATATGCCG bc_diffs=0 AACCATGCACCACCTGCACACGACCAACTAAATGCCACCACATCTCTGCAGTGTCGCCGTGCATGTCAAGCCTT A2C214_20116612 HWI-ST1128:217:D2HB4ACXX:8:1101:21248:45534 orig_bc=CCTAGGAT new_bc=CCTAGGAT bc_diffs=0 AACCGTGCACCACCTGTTTTCTGGCTTCCGAAGAAGAGGAACTATCTCTAGTTCTGTCCATCAATGTCAAGACCT 

Как это работает

  • -r

    -r говорит sed использовать расширенные регулярные выражения.

  • -n

    -n говорит sed не печатать строки, если явно не просить.

  • s/(.{106})/\n\1/p

    Если какая-либо строка имеет не менее 106 символов, мы добавляем новую строку в начало и печатаем ее.

    Поскольку пустые строки не содержат 106 символов, они не печатаются.

    Поскольку линии без последовательностей ДНК короче 106 символов, они не печатаются.

    Печатаются линии с последовательностями ДНК (их 106 символов или более). Поскольку пустые строки сами по себе не печатаются, мы должны добавить новую строку в начало строки. Таким образом, гарантируется, что каждой записи ДНК предшествует пустая строка.

Не-GNU sed

Если вы используете OSX (BSD), попробуйте:

 sed -E -n -e 's/(.{106})/\n\1/p' file 

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

 awk '$6 {print "\n"$0}' file 

Последовательность ДНК – это шестое поле на линии. Таким образом, для любой строки с непустым шестом полем мы печатаем эту строку, которой предшествует новая строка.

Просто хочу упомянуть, что вы можете сделать это, используя vi :

 :g/PATTERN/normal 2dd 

Где PATTERN – это то, что вы ищете. Это будет соответствовать PATTERN и выполнить 2dd (удалить строку – 2 раза) в normal режиме.

Использование Ex / vi

Создание команды @ReulSharabin:

 ex -s +'g/bc_diffs=0$/d +2' +x file 

который похож на:

 vim +':g/bc_diffs=0$/d +2' +:x file 

(+ команда = выполнить команду; +x = сохранить и выйти)

Хорошо, хорошо, это плохая идея: мы не должны загружать в память такой огромный файл