Как объединить два файла с совпадающими символами/цифрами перед символом подчеркивания, используя цикл for? У меня много файлов в каталоге
Вход:
SRR9200887_1.fastq
SRR9200887_2.fastq
SRR9200888_1.fastq
SRR9200888_2.fastq
SRR9200889_1.fastq
SRR9200889_2.fastq
Ожидаемый результат:
SRR9200887.fastq
SRR9200888.fastq
SRR9200889.fastq
Моя попытка:
for l in $(ls *.fastq | cut -d_ -f1 | sort |uniq); do cat ${l}*.fastq
Чтобы cat
объединить файлы, предполагая, что у вас есть совпадения «_1.fastq» и «_2.fastq» для каждого «SRR», один из возможных вариантов:
SRR_array=(*_1.fastq)
for f in "${SRR_array[@]%%_*}"
do
cat "$f"_1.fastq "$f"_2.fastq > "$f".fastq
done
Если вы хотите удалить файлы _1.fastq и _2.fastq после их объединения:
SRR_array=(*_1.fastq)
for f in "${SRR_array[@]%%_*}"
do
cat "$f"_1.fastq "$f"_2.fastq > "$f".fastq
rm "$f"_1.fastq "$f"_2.fastq
done
Одна bash
идея:
while read -r pfx
do
cat "${pfx}"_*.fastq >> "${pfx}".fastq
done < <(find . -name "*_*.fastq" | cut -d'_' -f1 | sort -u)
Настройка текущего кода OP:
for l in $(ls -1 *_*.fastq | cut -d_ -f1 | sort | uniq)
do
cat ${l}_*.fastq >> "${l}".fastq
done
Где:
_
в имени; если скрипт запускается более одного раза, это гарантирует, что мы не подберем предыдущие конкатенированные файлыls
перечисляет один файл в строке (отсюда и -1
)sort | uniq
можно заменить на sort -u
С bash
и его расширением параметра :
for i in *_1.fastq; do
cat "${i%_*.fastq}_1.fastq" "${i%_*.fastq}_2.fastq" > "${i%_*.fastq}.fastq";
done
${i%_*.fastq}
выводит $i
без _
и всех следующих за ним, например. SRR9200887
.
for f in *_*.fastq; do cat "$f" >> "${f%_*}.fastq"; done
Ваш подход кажется мне самым оригинальным и креативным. Его главный недостаток (по сравнению с другим решением) заключается в том, что он не является идемпонентным: вы не можете просто повторно запустить код на тех же входных данных, потому что вам нужно для вашего алгоритма >>
.
Используя любой awk (непроверенный):
awk '
FNR==1 {
out = FILENAME
sub(/_[0-9]+/,"",out)
if ( out != prev ) {
close(prev)
prev = out
}
}
{ print > out }
' *_*.fastq
Это объединит файлы с одним и тем же суффиксом независимо от того, сколько файлов имеют один и тот же суффикс, а не только 2.
Следующая страница содержит подсказки, почему бесполезно использовать вывод
ls
: Почему бы не разобрать ls?