Объединение файлов в папке с тем же именем файла, кроме одного символа - PullRequest
0 голосов
/ 21 октября 2018

У меня есть имена файлов, подобные следующим:

fastqs/hgmm_100_S1_L001_R1_001.fastq.gz
fastqs/hgmm_100_S1_L002_R1_001.fastq.gz
fastqs/hgmm_100_S1_L003_R1_001.fastq.gz

fastqs/hgmm_100_S1_L001_R2_001.fastq.gz
fastqs/hgmm_100_S1_L002_R2_001.fastq.gz
fastqs/hgmm_100_S1_L003_R2_001.fastq.gz

И я хочу объединить их в группы, показанные выше, позволяя объединить LXXX.

Я могу сделать это следующим образом:

cat fastqs/hgmm_100_S1_L00?_R1_001.fastq.gz > data/hgmm_100_S1_R1_001.fastq.gz
cat fastqs/hgmm_100_S1_L00?_R2_001.fastq.gz > data/hgmm_100_S1_R2_001.fastq.gz

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

Спасибо, Джек

РЕДАКТИРОВАТЬ:

Извините за невключая это в оригинальном сообщении, но что, если бы у меня было что-то вроде:

fastqs/hgmm_100_S1_L001_R1_001.fastq.gz
fastqs/hgmm_100_S1_L002_R1_001.fastq.gz
fastqs/hgmm_100_S1_L003_R1_001.fastq.gz

fastqs/hgmm_200_S1_L001_R2_001.fastq.gz
fastqs/hgmm_200_S1_L002_R2_001.fastq.gz
fastqs/hgmm_200_S1_L003_R2_001.fastq.gz

(Единственное изменение - это самое начало (100 -> 200))

Как это будет работать?По сути, я хочу объединить эти файлы до тех пор, пока все части имени, кроме L ???идентичен

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Если шаблон _L###_ существует только в этой части имени файла, вы можете попробовать что-то вроде этого:

#!/usr/bin/env bash

# Define an associative array. Requires bash 4+
declare -A a

# Use extended glob notation. Read the man page or this.
shopt -s extglob

# Collect the file patterns by writing indexes in the array.
for f in fastqs/*_L+([0-9])_*.fastq.gz; do
  a["${f/_L+([0-9])_/_*_}"]=1
done

# And finally, gather your files.
for f in "${!a[@]}"; do
  # Strip any existing directory part of the filename to build our target
  target="data/${f##*/}"
  # Concatenate files matching the glob into our intended target
  cat $f > "${target/[*]_/}"
done
  • Мы используем Pattern Substitution для преобразования переменной части каждой спецификации файлав глобус.
  • Мы используем индекс ассоциативного массива, поскольку он позволяет легко хранить уникальный список.
  • ${! позволяет нам проходить через индексы массива, а не его значения.
0 голосов
/ 21 октября 2018

Вы можете сделать группировку на лету.Переберите все файлы и добавьте их в сгруппированный файл.* и ? расширяются в отсортированном виде, поэтому порядок должен быть правильным.

cd fastqs
for f in *_L???_*fastq.gz; do
    cat "$f" >> "../data/${f/_L???_/_}"
done
cd ..

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

...