Использование Bash для ручного редактирования текстового файла или файла Fastq

Я хотел бы вручную отредактировать файл Fastq, используя Bash, на несколько похожих строк.

В файлах Fastq чтение последовательности начинается со строки 2, а затем встречается в каждой четвертой строке (т.е. строки 2, 6, 10, 14...).

Я хотел бы создать отредактированный текстовый файл, идентичный файлу Fastq, за исключением того, что первые 6 символов чтения последовательности обрезаются.

Неотредактированный быстрый запрос:

@M03017:21:000000000
GAGAGATCTCTCTCTCTCTCT
+
111>>B1FDFFF

Отредактировано FastQ:

@M03017:21:000000000
TCTCTCTCTCTCTCT
+
111>>B1FDFFF

person The Nightman    schedule 16.02.2015    source источник


Ответы (2)


GNU sed может сделать это:

sed -i~ '2~4s/^.\{6\}//' file

Адрес 2~4 означает "начать со строки 2, повторять каждые 4 строки".

s означает замену, ^ соответствует началу строки, . соответствует любому символу, \{6\} указывает длину ("квантификатор"). Строка замены пуста (//).

-i~ заменяет файл на месте, оставляя резервную копию с добавлением ~ к имени файла.

person choroba    schedule 16.02.2015

Я думаю, awk идеально подходит для этого:

$ awk 'NR%4==2 {gsub(/^.{6}/,"")} 1' file
@M03017:21:000000000
TCTCTCTCTCTCTCT
+
111>>B1FDFFF

Это удаляет первые 6 символов во всех строках в позиции 4k+2.

Объяснение

  • NR%4==2 {} делать что-то, если номер записи (номер строки) находится в форме 4k+2.
  • gsub(/^.{6}/,"") замените 6 первых символов пустой строкой.
  • 1 оценивается как True, напечатайте строку.
person fedorqui 'SO stop harming'    schedule 16.02.2015
comment
Странно, этот код имеет смысл, но когда я использую приведенную выше строку кода, а затем подключаюсь к большему или вывожу в файл, я получаю точный текст, с которого начал, без обрезки или ошибок. Есть идеи, почему? - person The Nightman; 16.02.2015
comment
FWIW, я просто передал его в новый файл, и он такой же, как в stdout. - person user3439894; 16.02.2015
comment
Странный. Сделайте некоторую отладку, например, сказав awk 'NR%4==2' file, и посмотрите, напечатает ли она строку, которую вы хотите заменить. Может быть, у вас есть какой-то заголовок... - person fedorqui 'SO stop harming'; 16.02.2015
comment
Запуск, который указывает на правильные строки файла, в котором он появляется. - person The Nightman; 16.02.2015
comment
@TheNightman, вы можете попробовать заменить ^.{6} на ^......, если ваш awk не понимает регулярное выражение. - person fedorqui 'SO stop harming'; 16.02.2015
comment
Кажется, это так. Использование ^...... и последующий вывод в файл дает мне то, что я ищу. Спасибо. - person The Nightman; 16.02.2015
comment
@TheNightman приятно это читать! Кроме того, следите за своим пальцем, вы постоянно принимаете и не принимаете :) stackoverflow.com/posts/28545286/timeline - person fedorqui 'SO stop harming'; 16.02.2015
comment
да, я не знал, что нельзя выбрать два ответа. Я предполагаю, что если я проголосую за ответ как за полезный, человек получит признание независимо от того, отмечу ли я его как «ответ»? - person The Nightman; 16.02.2015
comment
@TheNightman Ага! Вы можете проголосовать, принять или и то, и другое. Когда я спрашиваю, я обычно отмечаю как принятый ответ, который помог мне больше всего, и поддерживаю те, которые я считаю полезными и хорошо объясненными (обычно это включает и принятый ответ). Дело в том, что принятый ответ, вероятно, привлечет больше внимания (и, следовательно, голосов) от будущих посетителей, поскольку он отображается первым в списке. - person fedorqui 'SO stop harming'; 17.02.2015