Как скопировать строки из нескольких файлов в один новый файл и сохранить имя файла?

У меня есть 81 файл в формате .fasta, который содержит (до) 53 элемента. Такие как:

/User/MyData/Sample_1.fasta /User/MyData/Sample_2.fasta .... /User/MyData/Sample_81.fasta 

Каждый файл .fasta содержит идентификатор имени и строку символов, помеченных как:

 >AT1G00001 ATCCACTGCTGTGTACCTGATCAGTGCTGACCCAYTGTGACACTGTG >AT2G00002 AAAAATTTTGCCCGTGTGGGCCAAACTGTCATGCATGCACCGTACGTGCATGCAT .... >ATXGXXXXX(up to 53) AAACCCTCTTTGTGCCTGTGCATGCA 

Я хотел бы скопировать строки из каждого из 81 файлов .fasta в новый файл .fasta, чтобы:

 /User/MyData/AT1G00001.fasta /User/MyData/AT2G00002.fasta .... /User/MyData/ATXGXXXXX.fasta 

И содержимое одного из них содержит (после копирования из всех файлов Sample_X.fasta в каталоге):

 >Sample_1 ATCCACTGCTGTGTACCTGATCAGTGCTGACCCAYTGTGACACTGTG >Sample_2 ATCGACTCCCGTAGGACTGATTTTTCTGACCCCATTGTGACACTGTG .... >Sample_81 TTCTGACCCCATTGTGACACTGTGATCGACTCCCGTAGGACTGATTT 

Я столкнулся с одним или двумя подобными вопросами, но ничто с точным нюансом сохранения SampleName в скопированном выходном файле и мне трудно получить примеры из похожих, но разных вопросов для работы.

Большое вам спасибо за любую помощь!

3 Solutions collect form web for “Как скопировать строки из нескольких файлов в один новый файл и сохранить имя файла?”

У меня для вас следующий код: под ним есть объяснение, как это работает.

Сначала зайдите в рабочий каталог ( cd /User/MyData/ ), чтобы запустить эту программу:

 awk ' FNR==1 { sample = FILENAME ; sub(/\.fasta/, "", sample } /^>/ { target = substr($0,2)".fasta" ; next } { print ">" sample > target ; print > target } ' Sample_*.fasta 

Программа awk выполняет Sample_*.fasta файлам Sample_*.fasta . В начале каждого входного файла ( FNR==1 ) он извлекает имя образца из текущего имени файла, удаляя суффикс «.fasta». Если строка начинается с > то целевое имя файла для этой записи берется после символа > и добавляется суффикс имени файла .fasta. Для других типов строк ранее извлеченное имя образца записывается в целевой файл, а во второй строке записываются текущие данные.

Примечание. Если вы наблюдаете проблемы со «слишком большим количеством дескрипторов открытых файлов», лучшим вариантом является переход на GNU awk если это возможно!

Если GNU awk недоступно или не может быть доступно на вашей платформе, вам потребуется несколько дополнительных изменений; ключ состоит в том, чтобы закрыть каждый файл после его записи, используя функцию close() , в результате чего вы должны добавить к закрытым файлам. (Это сложнее и менее результативно, поэтому стоит подумать о том, чтобы получить GNU awk и использовать первый вариант.)

Эти изменения приведут к такой программе, как:

 # because of the append operation you need to empty the file targets # before calling subsequent awk code, eg by: rm -f AT???????.fasta awk ' FNR==1 { sample = FILENAME ; sub(/\.fasta/, "", sample } /^>/ { target = substr($0,2)".fasta" ; next } { printf ">%s\n%s\n", sample, %0 >> target ; close(target) } ' Sample_*.fasta 

Обратите внимание, что перед вызовом awk программы вы должны убедиться, что вы удаляете или удаляете любые существующие выходные файлы из предыдущих вызовов (иначе ваш новый вывод будет добавлен к данным, ранее существующим в соответствующих выходных файлах.

Хотя было бы интересно узнать, что вы пробовали до сих пор, вот пример того, как awk можно использовать для этой работы:

 awk ' FNR == 1 { sub(/\.fasta$/, "", FILENAME) } /^>/ && sub(/^>/, "") { newfile = $0 ".fasta" next } { print ">" FILENAME >> newfile print $0 >> newfile }' Sample_*.fasta 

Некоторая оболочка: это будет намного медленнее, чем awk-программа.

 cd /User/MyData for sample in Sample*.fasta; do sample_name=${sample%.fasta} while read name; read data; do name=${name#>} printf ">%s\n%s\n" "$sample_name" "$data" >> "$name.fasta" done < "$sample" done 
  • Сравните 2 файла, если он находится между диапазоном чисел
  • SED или AWK: добавьте символ в каждую строку после найденного шаблона
  • «Sed» переписать файл для отображения целых чисел и удалить оставшиеся символы
  • Как я могу получить много адресов из многих траекторий с помощью сценария bash без ошибок?
  • Как анализировать файл данных для извлечения определенных данных и формата для другого использования?
  • Использование 'sed' для поиска и замены
  • замените с начала строки на 1 из нескольких шаблонов в конец другой строки со вторым шаблоном
  • Сортировка нескольких файлов csv на основе двух столбцов в каталоге
  • Может ли grep выводить только указанные группы, которые соответствуют?
  • В верхнем регистре только первая буква каждой строки
  • sed count lines между шаблоном - несколько файлов
  • Linux и Unix - лучшая ОС в мире.