объединение разных файлов в unix

У меня есть папка, в которой есть куча файлов, и я хотел бы собрать отдельные файлы. Макет такой:

sample1_S99_L1_R1_001.fastq.gz
sample1_S99_L2_R1_001.fastq.gz

sample1_S99_L1_R2_001.fastq.gz
sample1_S99_L2_R2_001.fastq.gz

sample2_S88_L1_R1_001.fastq.gz
sample2_S88_L2_R1_001.fastq.gz

sample2_S88_L1_R2_001.fastq.gz
sample2_S88_L2_R2_001.fastq.gz

и так далее для разных образцов. Я хотел бы скопировать sample1_S99 _ * _ R1_001.fastq.gz в 1 файл gunzip. Таким образом, образцы, сгруппированные в приведенном выше коде, должны быть объединены.

Вручную я бы сделал что-то вроде этого:

cat sample1_S99_L1_R1_001.fastq.gz sample1_S99_L2_R1_001.fastq.gz > sample1.R1.fastq.gz

а также

cat sample1_S99_L1_R2_001.fastq.gz sample1_S99_L2_R2_001.fastq.gz > sample1.R2.fastq.gz

Моя идея заключалась в том, чтобы автоматизировать эту процедуру, и я придумал следующее:

ls | awk -F '[_.]' '{print $1}' > test.txt
sort -u test.txt > names_final.txt
while read line;do cat $line_*_*_R1_*.fastq.gz > $line.R1.fastq.gz;done < names_final.txt
while read line;do cat $line_*_*_R2_*.fastq.gz > $line.R2.fastq.gz;done < names_final.txt

Проблема, с которой я столкнулся сейчас, заключается в том, что эти команды, похоже, объединяют все файлы R1. Если я напечатаю, например

ls sample1_*_*_R1_*.fastq.gz 

Я получаю только те файлы, которые хочу собрать вместе. Так что я не уверен, что здесь моя ошибка.

У кого-нибудь есть идея?

Заранее спасибо.


person Woerrie    schedule 29.04.2016    source источник
comment
так вы хотите, чтобы блоки file_LX_001 были вместе, затем file_LX_002 вместе и т. д.? Пример немного сбивает с толку   -  person fedorqui 'SO stop harming'    schedule 29.04.2016
comment
Извините за путаницу. Я хотел бы собрать вместе файлы с одинаковым именем образца и одинаковым значением R. Итак, R1 и R2.   -  person Woerrie    schedule 29.04.2016
comment
Итак, во входных данных, которые вы только что обновили, какие из них должны быть вместе? все s99, затем все s88 и т. д.?   -  person fedorqui 'SO stop harming'    schedule 29.04.2016
comment
Те, которые должны быть вместе, имеют одинаковое значение R, поэтому R1 и R2. Таким образом, выходные данные для предоставленных мной файлов примеров должны быть: sample1.R1.fastq.gz sample1.R2.fastq.gz sample2.R1.fastq.gz sample2.R2.fastq.gz.   -  person Woerrie    schedule 29.04.2016
comment
Обратите внимание, что в $line_*_*_R2_*.fastq.gz это заменяет переменную $line_ на завершающий знак подчеркивания, а не $line, как вы хотели. Подчеркивание является допустимым символом в идентификаторах (но дефис не будет, поэтому $line-*-*-R2-*.fastq.gz будет работать, если в именах файлов используются дефисы вместо подчеркивания). Вам, вероятно, понадобится: ${line}_*_*_R2_*.fastq.gz, где фигурные скобки ограничивают имя переменной.   -  person Jonathan Leffler    schedule 29.04.2016


Ответы (2)


$line_*_*_R1_*.fastq.gz анализируется как ${line_}*_*_R1_*.fastq.gz, поскольку подчеркивания являются допустимыми символами в именах переменных. $line_ с подчеркиванием пусто, поэтому глобус *_*_R1_*.fastq.gz соответствует всем именам примеров из-за ведущей звездочки.

Чтобы исправить это, используйте явные фигурные скобки.

while read line;do cat ${line}_*_*_R1_*.fastq.gz > $line.R1.fastq.gz;done < names_final.txt
while read line;do cat ${line}_*_*_R2_*.fastq.gz > $line.R2.fastq.gz;done < names_final.txt
person John Kugelman    schedule 29.04.2016
comment
Кажется, это исправило. Спасибо! - person Woerrie; 29.04.2016

Я бы использовал двойной for:

for i in {00..99}; do
   for j in 1 2; do
       cat sample1_S${i}_L*_R${j}_001.fastq.gz >> sample1.S$i.R$j.fastq.gz
   done
done

Это проверяет все файлы и cat вместе с теми, которые имеют одинаковые sample1_SXX и _RYY.

Обратите внимание на две вещи:

  • вам, вероятно, понадобятся файлы, сжатые с помощью сжатия от zcat до cat.
  • использование фигурных скобок при использовании переменных для определения области имени: echo $a_c пытается отобразить переменную a_c, тогда как echo ${a}_c отображает переменную $a, а затем _c.
person fedorqui 'SO stop harming'    schedule 29.04.2016
comment
Можно объединить несколько сжатых файлов. В этом случае gunzip извлечет сразу всех участников. - person John Kugelman; 29.04.2016
comment
@JohnKugelman, хм, полезно знать. Значит, результатом нескольких cat *.gz тоже будет сжатый файл? - person fedorqui 'SO stop harming'; 29.04.2016