2015-01-19 2 views
0

У меня есть файл fastq со строгим форматированием.Sed. удалить многострочные шаблоны. RegExp

входной файл:

@HWI-ST383:199:D1L73ACXX:3:1101:1309:1956 1:N:0:ACAGTGA 
+ 
JJJHIIJFIJJJJ=BFFFFFEEEEEEDDDDDDDDDDBD 
@HWI-ST383:199:D1L73ACXX:3:1101:3437:1952 1:N:0:ACAGTGA 
GATCTCGAAGCAAGAGTACGACGAGTCGGGCCCCTCCA 
+ 
IIIIFFF<[email protected][email protected]############### 

В моем последнем question я решил мою проблему. Но я не правильно понимаю формат файла. Мне нужно, чтобы получить из входного файла этот файл:

выход:

@HWI-ST383:199:D1L73ACXX:3:1101:3437:1952 1:N:0:ACAGTGA 
GATCTCGAAGCAAGAGTACGACGAGTCGGGCCCCTCCA 
+ 
IIIIFFF<[email protected][email protected]############### 

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

Этот скрипт работает правильно. Но я не пишу регулярное выражение, чтобы получить то, что вы хотите

awk '/\n[GATC]*\n/' RS=+ ORS=+ 

после работы скрипта я ожидал увидеть это output file. К этому link вы увидите выражение, которое описывает строки, которые я хочу удалить.

+1

Что вы хотите сказать? – Wintermute

+0

Какой язык и какое регулярное выражение использовать для удаления многострочного шаблона из входного файла? –

+0

Пока вы продолжаете использовать sed для проблем, охватывающих несколько строк, вам придется полностью переписывать их каждый раз, когда у вас будет минимальное изменение требований, и вам, вероятно, придется просить помощи для этого. Все эти дурацкие, архаичные односимвольные конструкторы sed для обработки нескольких строк стали устаревшими в середине 1970-х годов, когда был изобретен awk. Это была специальная работа awk (ориентированная на запись, а не ориентированная на линию), - просто используйте ее. –

ответ

1
sed '/^@H/ { N; /\n+$/ { N; d } }' filename 

Это работает следующим образом:

/^@H/ {  # if the current line begins with @H 
    N   # fetch the next one, append it. 
    /\n+$/ { # if the combined pattern has \n+ at the end (that is, if the new 
      # line is "+") 
    N  # fetch another line 
    d  # and discard the lot. 
    } 
} 
+0

Вы поможете мне во второй раз. Большое спасибо! Я в твоем долгу. –

0

Через perl.

$ perl -0777pe 's/[GATC]+\h*\n\K\+.*?[GATC]+\n//gs' file 
@HWI-ST383:199:D1L73ACXX:3:1101:1309:1956 1:N:0:ACAGTGA 
GATCTCGAAGCAAGAGTACGACGAGTCGGGCCCCTCCA 
+ 
IIIIFFF<[email protected][email protected]############### 

Но это оставляет пространство в последнем нетронутом виде. Если вы хотите удалить также конечные пробелы, попробуйте использовать ниже.

$ perl -0777pe 's/[GATC]+\K\h*\n\+.*?[GATC]+\n/\n/gs' file 
@HWI-ST383:199:D1L73ACXX:3:1101:1309:1956 1:N:0:ACAGTGA 
GATCTCGAAGCAAGAGTACGACGAGTCGGGCCCCTCCA 
+ 
IIIIFFF<[email protected][email protected]############### 
+0

Я думаю, что OP хотел знать, как команда, с которой они уже работали. –

+0

Хорошо. У меня есть этот вход [файл] (http://pastebin.com/CFJq6kGg). Когда я применяю ваш скрипт к файлу, я получаю этот вывод [файл] (http://pastebin.com/Pgj6NJDk). Как решить эту проблему? –

+0

Вы могли бы предоставить ожидаемый результат для половины вашего ввода? Так что я получу идею более чем одной последовательности. –

0

Это звучит, как все, что вам нужно:

$ awk -v RS= '{gsub(/(^|\n)@[^\n]+\n\+\n[^\n]+\n/,"")}1' file 
@HWI-ST383:199:D1L73ACXX:3:1101:3437:1952 1:N:0:ACAGTGA 
GATCTCGAAGCAAGAGTACGACGAGTCGGGCCCCTCCA 
+ 
IIIIFFF<[email protected][email protected]############### 

т.е. просто удалить любую строку, которая начинается с "@" ((^|\n)@), затем кучу символов, отличных от новой строки ([^\n]+), а затем + между символами новой строки (\n\+\n), то куча других символов, отличных от новой строки, заканчивается символом новой строки ([^\n]+\n). Если какие-либо строки могут иметь ведущие или конечные пробелы, тогда просто бросайте [[:blank:]]* везде, где может быть пробел.