Как объединить файлы RNA-seq, сгенерированные на разных дорожках

Чтобы заменить запятые с точкой с запятой в последних n строках наed:

n=3
ed -s input <<< '$-'$((n-1))$',$s/,/;/g\nwq'

Разделение на части:

  • ed -s= работать без вывода сообщений (не сообщать о байтах, записанных в конце)
  • '$-'= с конца файла($)минус...
  • $((n-1))= n -1 строка...
  • ($'... '= заключите в кавычки остальную часть команды, чтобы защитить ее от оболочки)
  • ,$s/,/;/g=... до конца файла (,$), поиск и замена всех запятых точками с запятой.
  • \nwq= завершить предыдущую команду, затем сохранить и выйти

Чтобы заменить запятые с точкой с запятой в последних n строках наsed:

n=3
sed -i "$(( $(wc -l < input) - n + 1)),\$s/,/;/g" input

Разбить это на части:

  • -i= редактировать файл "в -месте"
  • $((... ))= подсчитайте:
  • $( wc -l < input)= получить количество строк в файле
  • -n + 1= перейти назад n -1 строка
  • ,\$= от n -1 строк до конца файла:
  • s/,/;/g= заменить запятые точкой с запятой.
0
12.04.2018, 18:51
2 ответа

Следующий цикл дает нам уникальные префиксы имен файлов FastQ в текущем каталоге. Он основан на том факте, что всегда будет четыре символа подчеркивания(_)между префиксом имени файла, который нам нужен, и R1или R2позже в имени файла.

for name in *.fastq.gz; do
    printf '%s\n' "${name%_*_*_*_R[12]*}"
done | uniq

Следующий вариант аналогичен, но не использует цикл (вместо удаления последнего бита имени файла сохраняется первый бит имени файла):

printf '%s\n' *.fastq.gz | sed 's/^\([^_]*_[^_]*\).*/\1/' | uniq

При заданном списке файлов любое из приведенных выше действий возвращает

DR14_DCRP
MC9_FNEN
MC9_FREN
MC9_ZH

Затем мы читаем эти префиксы и создаем конкатенированные файлы:

for name in *.fastq.gz; do
    printf '%s\n' "${name%_*_*_*_R[12]*}"
done | uniq |
while read prefix; do
    cat "$prefix"*R1*.fastq.gz >"${prefix}_R1.fastq.gz"
    cat "$prefix"*R2*.fastq.gz >"${prefix}_R2.fastq.gz"
done

или, используя приведенный выше код sed,

printf '%s\n' *.fastq.gz | sed 's/^\([^_]*_[^_]*\).*/\1/' | uniq |
while read prefix; do
    cat "$prefix"*R1*.fastq.gz >"${prefix}_R1.fastq.gz"
    cat "$prefix"*R2*.fastq.gz >"${prefix}_R2.fastq.gz"
done

Приведенный выше код не используетbash-специфические (или специфические )функции GNU -и должен работать во всех оболочках POSIX.


ОБНОВЛЕНИЕ :Я работаю с биоинформатиками, и мой коллега прокомментировал:

One should not just simply merge fastq files... In an ideal world, one should map each lane separately, adding an appropriate RG, and then merge the BAM files. Because lane-specific effects exist, etc. It can be more or less important, depending on the downstream application of course.

С вопросами по этому поводу обращайтесь к сайту Bioinformatics Stack Exchange .

3
28.01.2020, 02:23

Bash раствор:

for f in *.fastq.gz; do 
    [[ "$f" =~ ^([^_]+_[^_]+)_.*(_[^_]+)_[0-9]+\.fastq\.gz$ ]]
    cat "$f" >> "${BASH_REMATCH[1]}${BASH_REMATCH[2]}.fastq.gz"
done

  • ^([^_]+_[^_]+)_.*(_[^_]+)_[0-9]+\.fastq\.gz$-решающий шаблон регулярного выражения для захвата первых 2 префиксов в 1-ю захваченную группу (например.MC9_PRENR-назвали суффикс во 2-й захваченной группе (, например._R1)
1
28.01.2020, 02:23

Теги

Похожие вопросы