2016-12-05 6 views
0

У меня есть имена файлов, как:Переименование длинных имен файлов в натуральном

5_END_1033_ACAGTG_L002_R1_001.fastq.gz 
5_END_1033_ACAGTG_L002_R2_001.fastq.gz 
40_END_251_GTGAAA_L002_R1_001.fastq.gz 
40_END_251_GTGAAA_L002_R2_001.fastq.gz 

Я хочу что-то вроде:

END_1033_R1.fastq.gz 
END_1033_R2.fastq.gz 
END_251_R1.fastq.gz 
END_251_R2.fastq.gz 

Есть хорошие способы переименовывать эти файлы в Linux?

ответ

2

Вы можете попробовать использовать цикл, чтобы извлечь важную часть файла:

for file in ./*.gz; do newname=$(echo $file | sed -re 's/^([^ACAGTG]+).*(R[1-3]).*/\1\2\.fastq\.gz/g'); echo $newname; done 

Это просто даст вам новый список имен файлов. Вы можете перемещать их:

for file in ./*.gz; do newname=$(echo $file | sed -re 's/^([^ACAGTG]+).*(R[1-3]).*/\1\2\.fastq\.gz/g'); mv $file $newname; done 

Чтобы разорвать этот вниз немного:

  • петли над * .gz файлами
  • создать переменную, которая удаляет ненужное содержание от имени
  • переместите имя файла на это новое имя

Я ожидаю, что есть лучшие способы сделать это, но это то, что я придумал с верхней части моей головы.

Тест:

$ ls 
40_END_251_GTGAAA_L002_R1_001.fastq.gz 40_END_251_GTGAAA_L002_R2_001.fastq.gz 5_END_1033_ACAGTG_L002_R1_001.fastq.gz 5_END_1033_ACAGTG_L002_R2_001.fastq.gz 

$ for file in ./*.gz; do newname=$(echo $file | sed -re 's/^([^ACAGTG]+).*(R[1-3]).*/\1\2\.fastq\.gz/g'); echo $newname; done 
./40_END_251_R1.fastq.gz 
./40_END_251_R2.fastq.gz 
./5_END_1033_R1.fastq.gz 
./5_END_1033_R2.fastq.gz 

$ for file in ./*.gz; do newname=$(echo $file | sed -re 's/^([^ACAGTG]+).*(R[1-3]).*/\1\2\.fastq\.gz/g'); mv $file $newname; done 

$ ls 
40_END_251_R1.fastq.gz 40_END_251_R2.fastq.gz 5_END_1033_R1.fastq.gz 5_END_1033_R2.fastq.gz 

Примечание Я делаю это в Баш 4.4.5

EDIT Учитывая, что я не совсем уверен, какие столбцы в имени являются наиболее важными , awk может работать лучше:

for file in ./*.gz; do newname=$(echo $file | awk -F'_' '{print $2 "_" $3 "_" $6}' -); echo $newname; done 

Это будет расколоть имя файла с помощью _ и позволяют ссылаться на столбцы, которые вы хотите с помощью $X:

for file in ./*.gz; do newname=$(echo $file | awk -F'_' '{print $2 "_" $3 "_" $6}' -); mv $file "${newname}.fastq.gz"; done 
+0

Спасибо большое :) – Kisun

+0

я просто понял, что это не работает во всех ситуациях, как: 17_END_107A_CGATGT_L005_R1_001.fastq. gz и 29_END_4271A_ACAGTG_L008_R1_001.fastq.gz. Кроме того, я бы предпочел вывести цифры и сначала «_» i.e 40_, 5_ и т. Д. – Kisun

+1

Позвольте мне посмотреть, смогу ли я его настроить :) – bedwyr

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

  • Нет связанных вопросов^_^