Конкатенация файлов в порядке команды 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