Объединить файлы с идентификатором перед подчеркиванием - PullRequest
0 голосов
/ 24 апреля 2018

Я ищу способ объединения файлов с таким же идентификатором до первого удаления в имени файла. Выходные данные должны содержать только идентификатор, за которым следует fastq.gz. Выходные данные должны быть сжаты.

в

0394_L007_R1.fastq.gz 
0394_L008_R1.fastq.gz 
0444_L005_R1.fastq.gz 
0444_L006_R1.fastq.gz 

из

0394.fastq.gz
0444.fastq.gz

Что-то более удобное, чем:

cat 0394_L007_R1.fastq.gz  0394_L008_R1.fastq.gz   > 0394.fastq.gz

Ответы [ 3 ]

0 голосов
/ 24 апреля 2018

Используя простую команду:

ls | tr '_' '.' | cut -d '.' -f1,4,5 | Uniq

0 голосов
/ 24 апреля 2018

Простой цикл, который продолжает добавляться к целевому файлу. Поэтому на самом деле нужно просто найти правильный «целевой файл» для текущего файла и добавить к нему.

#! /bin/bash
for x in *.fastq.gz; do
     currid=$(echo "$x" | cut -d'_' -f1)
     cat "$x" >> "$currid".fastq.gz
done
0 голосов
/ 24 апреля 2018

Сначала соберите уникальные идентификаторы в ассоциативном массиве:

declare -A ids
for f in *.fastq.gz; do
  ids[${f%%_*}]=1
done

Затем используйте gzcat для передачи (несжатого) содержимого каждого соответствующего файла в gzip, чтобы повторно сжать выходные данные в одинфайл.

for id in "${!ids[@]}"; do
  gzcat "$id"_*.fastq.gz | gzip -c > "$id".fastq.gz
done

(или, поскольку я забыл, что сцепленные файлы Gzip сами по себе являются действительными файлами Gzip,

for id in "${!ids[@]}"; do
  cat "$id"_*.fastq.gz > "$id".fastq.gz
done

)

...