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

Вы можете сказать plymouth, чтобы он показывал сообщения в виде текста так:

$ plymouth-set-default-theme text
$ /usr/libexec/plymouth/plymouth-update-initrd

References

1
27.04.2015, 15:56
3 ответа

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

Сначала перейдите в рабочий каталог ( 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 Iterate по всему образец _ *. Fasta файлы. При запуске каждого входного файла ( FNR == 1 ) он извлекает имя образца из текущего имени файла, удалив суффикс ".fasta". Если строка начинается с > > , то целевое имя файла для этой записи взята из символа > , а суффикс имени файла «.Fasta» добавлено. Для других типов строк ранее извлеченное имя образца записывается в целевой файл, а во второй строке текущие данные записаны.

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

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

Эти изменения будут привести к тому, что в таком случае, как:

# because of the append operation you need to empty the file targets
# before calling subsequent awk code, e.g. 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

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

1
27.01.2020, 23:50

Некоторые оболочки: это будет намного медленнее, чем неуклюжая программа.

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
0
27.01.2020, 23:50

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

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

Теги

Похожие вопросы