Чтобы заменить запятые с точкой с запятой в последних 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
= заменить запятые точкой с запятой. Следующий цикл дает нам уникальные префиксы имен файлов 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 .
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_PREN
)иR
-назвали суффикс во 2-й захваченной группе (, например._R1
)