2013-10-15 8 views
2

Я только начал учиться использовать командную строку. Надеюсь, это не вопрос свалить.Объединить файлы в команду 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 

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

+0

Hm, делает 'glob' заказа вашей оболочки ? потому что вы могли бы использовать 'cat * _R1 _ *. fastq> R1.fastq' then ... – Wrikken

ответ

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

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

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

IFS=' 
' 
+3

Я считаю, что использование' ls' и 'sort' является избыточным – jkshah

+0

sort будет сортировать _lines_ ввода. вместо этого используйте _ls -1_. кроме того, было бы неплохо выполнить сортировку версии: _sort -V_ – devnull

+0

* -1 * для ls избыточно, ls записывает одно имя файла в строке при записи в трубу. – pts

1

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

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

EDIT:

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

LC_ALL=C cat L*_R1_001.fastq > R1.fastq 
+0

Возможно, намек на использование 'LC_ALL = C cat L * _R1_001.fastq> R1.fastq', поэтому никаких смешных вещей не происходит из-за разных языков –

+0

@FredrikPihl Спасибо за ваши отзывы. Я добавил ваше предложение в ans. – jkshah

+0

Нет никакой гарантии, что '*' сортирует имена файлов. Для этого используйте 'ls'. – pts

Смежные вопросы