Конкатенация файлов в порядке команды Linux

Я только начал учиться использовать командную строку. Надеюсь, это не вопрос дампов.

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

L001_R1_001.fastq 
L002_R2_001.fastq 
L004_R1_001.fastq 
L005_R2_001.fastq
L001_R2_001.fastq 
L003_R1_001.fastq 
L004_R2_001.fastq 
L006_R1_001.fastq
L002_R1_001.fastq 
L003_R2_001.fastq 
L005_R1_001.fastq 
L006_R2_001.fastq

Вы можете видеть в именах файлов, это смесь R1 и R2, а числа после L00 не сортируются.

Я хочу объединить файлы в порядке имени файла, отдельно для файлов R1 и R2.

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

# for R1 files
cat L001_R1_001.fastq L002_R1_001.fastq L003_R1_001.fastq L004_R1_001.fastq L005_R1_001.fastq L006_R1_001.fastq > R1.fastq


# for R2 files
cat L001_R2_001.fastq L002_R2_001.fastq L003_R2_001.fastq L004_R2_001.fastq L005_R2_001.fastq L006_R2_001.fastq > R2.fastq

Не могли бы вы помочь мне написать сценарий, который я смогу использовать позже? Спасибо!

2 ответа

cat `ls -- *_R1_*.fastq | sort` >R1.fastq
cat `ls -- *_R2_*.fastq | sort` >R2.fastq

| sort не требуется в большинстве систем, потому что ls сортирует файлы по имени.

Если имена файлов содержат пробелы, то сначала сделайте это:

IFS='
'

Попробуйте использовать подстановочный знак *, Это автоматически расширит имена файлов в алфавитном порядке.

cat L*_R1_001.fastq > R1.fastq
cat L*_R2_001.fastq > R2.fastq

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

Если приведенная выше команда не дает желаемой сортировки, попробуйте переопределить настройку локали, используя LC_ALL=C как предложено Fredrik Pihl

LC_ALL=C cat L*_R1_001.fastq > R1.fastq
Другие вопросы по тегам