объединить файлы с похожей подстрокой в ​​имени файла - PullRequest
0 голосов
/ 27 мая 2019

Я хотел бы объединить файлы с одинаковым идентификатором перед подчеркиванием "ПЕРВЫЙ" "_". Ниже приведен пример двух таких файлов. Я думаю, cat это инструмент для использования.

в:

EIV105_S21_R1.fastq.gz 
EIV105_2_S117_R1.fastq.gz
EIV10_S13_R1.fastq.gz
EIV10_2_S109_R1.fastq.gz 

из

EIV105_R1.fastq.gz 
EIV10_R1.fastq.gz

Ответы [ 2 ]

1 голос
/ 27 мая 2019
#!/bin/sh

suffix=R1.fastq.gz

find *_?*_$suffix | sed 's/_.*//' | sort -u |\
while read id; do
    cat "$id"_?*_$suffix > "$id"_$suffix
    # gzip -cd "$id"_?*_$suffix | gzip > "$id"_$suffix
done
  • find перечисляет имена входных файлов
  • sed извлекает идентификаторы
  • sort выводит только уникальные идентификаторы
  • whileзацикливает уникальные идентификаторы (при условии, что они не содержат необычных символов, таких как обратная косая черта или новая строка)
  • cat создает выходные данные
  • gzip может дать лучшее сжатие, чем cat
0 голосов
/ 27 мая 2019

Вот небольшое изменение в ответе jhnc с использованием подстановки процесса для подачи в цикл while, который создает объединенные файлы gzip, например,

#!/bin/bash

suffix=R.fastq.gz
while read -r prefix; do
    cat "${prefix}_"* > "$prefix.$suffix"
done < <(for i in *.gz; do echo ${i%%_*}; done | sort -u)

Он использует цикл for для выделения и сбора уникальных префиксов для каждого существующего файла gzip в текущем каталоге, а затем перенаправляет этот уникальный список в качестве входных данных для цикла while.

( примечание: подстановка процесса , например, <(process) - это bashism , доступный в bash, но не в оболочке POSIX. При перенаправлении процесса замена для оплаты цикла while между перенаправлением и заменой процесса должен быть пробел, например < <(process))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...