Вопрос Как зайти в цикл


У меня есть 500 папок, содержащих много файлов * _1.fastq.gz и * _2.fastq.gz для каждой папки.

Я хочу:

cat *_1.fastq.gz > Combined *_1.fastq.gz & cat *_2.fastq.gz > Combined_2.fastq.gz

для каждой папки.

Как мне это достичь? Я хотел бы узнать немного bash, мне нравится python


1
2018-03-11 13:42


происхождения




ответы:


for i in {1..2} ; do cat *_$i.fastq.gz >>Combined_$i.fastq.gz ; done

Вероятно, это не сработает, как сжатые файлы gzip; Я бы предположил, что вы предпочли бы использовать zcat *_$i.fastq.gz >>Combined_$i.fastq & then gzip; или, может быть, лучше, просто отказаться от идеи кошки и сделать это:

for i in {1..2} ; do tar -c *_$i.fastq.gz >Combined_$i.fastq.gz.tar; done

для каждой папки - затем для восстановления папок, просто добавьте строку выше в следующий цикл и запустите это из папки верхнего уровня:

for f in *; do
  pushd . ; cd $f
      for i in {1..2} ; do tar -c *_$i.fastq.gz >Combined_$i.fastq.gz.tar; done
  popd
done

Таким образом, индекс цикла $ f выбирает каждую папку; спасает ваше место; cd в папку; выполняет цикл; снова возвращается в исходный каталог & петли.

Pushd / popd там, чтобы убедиться, что у вас нет роуминга в файловой системе! Не обязательно, но полезно учиться.


2
2018-03-11 14:02



с некоторыми небольшими ухищрениями, я заставил его делать то, что я хотел. Я сменил tar -c на cat, так как кот делает именно то, что мне нужно. Спасибо, что решили мою проблему - zazga


Это не отличный пример для обучения bash, но самый простой способ:

zcat *_1.fastq.gz | gzip > Combined_1.fastq.gz &
zcat *_2.fastq.gz | gzip > Combined_2.fastq.gz

Использование цикла:

for f in *_1.fastq.gz; do
    zcat "$f"
done | gzip > Combined_1.fastq.gz

Заметки

  • вы перебираете результаты шаблона glob - не соблазняйтесь анализировать вывод ls (http://mywiki.wooledge.org/ParsingLs)
  • цитируйте "$variables" когда вам нужно значение
  • вы можете перенаправить или передать вывод целого цикла for или while.

1
2018-03-11 13:59





Вам нужно что-то вроде

for d in */
    do cd $d && cat *_1.fastq.gz > Combined_1.fastq.gz && cat *_2.fastq.gz > Combined_2.fastq.gz
done

-1
2018-03-11 14:00