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

У меня есть 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 
  • Можно ли изменить файл yml с помощью сценария оболочки?
  • Преобразование содержимого файла в нижний регистр
  • Sed для удаления между разделителями, но сохранить первый разделитель
  • Как я могу найти и заменить только в том случае, если совпадение составляет целое слово?
  • bash расширяется до того же значения вместо значения строки за строкой в ​​команде sed
  • Как связывать линии между шаблоном начала и конца?
  • добавьте «#» в начале выбранных строк в файле
  • Каким образом можно фильтровать текстовый файл для удаления пустых строк?
  • Как я могу группировать числа в файле
  • распечатать последнее поле из строки + альтернатива для awk
  • оптимизировать команду с помощью or или pipe для анализа вывода ifconfig
  • Linux и Unix - лучшая ОС в мире.