как связать файл с несколькими заголовок в один

Я использовал // как разделитель и затем sed -in 's/\/\//\x0/g' dirstats получить то, что я хочу. Я все еще предпочел бы меньше hackish решения.

2
10.09.2014, 17:25
3 ответа
awk '
    /^>/ { 
        # print the first header
        if (c++ == 0) {print; print ""} 
        next
    } 
    /^$/ {next} 
    {printf "%s", $0} 
    END {print ""}
' a.fasta > b.fasta

содержимое b.fasta

>1

AAATTTTGGGGCCCACCCCGGGTTT..........ATGCCCCCCCCCC
3
27.01.2020, 21:54

Самый простой способ - это просто вывести 1-ю строку, а затем все остальные строки файла, которые не содержат i) символов пробела (в быстрых файлах они не имеют значения) и ii) строку быстрого заголовка (>):

head -n 1 file.fa > newfile.fa; grep -P '^[^> ]+$' >>  newfile.fa

Глава печатает 1-ю строку, а регулярное выражение grep ищет все строки, которые содержат только не> и не пробельные символы ([^> ]) от начала (^) до конца ($) этой строки.

Однако в результате получится файл типа:

>1
AAATTTTGGGGCCC
ACCCCGGGTTT
ATGCCCCCCCCCC

Чтобы получить всю последовательность на одной строке, используйте вместо этого вот это:

head -n 1 file.fa > newfile.fa; grep -P '^[^> ]+$' | tr -d '\n'>>  newfile.fa; 

Затем вы можете добавить дополнительную новую строку в конец файла с помощью

echo "" >> newfile.fa

Однако, если вы будете работать с такими файлами, я предлагаю сохранить эти два скрипта в файле в вашем $PATH ($HOME/bin, например) и сделать их исполняемыми (chmod a+x $HOME/bin/scriptname):

FastaToTbl

Этот сценарий берет быстрый файл и меняет его на tbl формат (заголовок быстрого файла, табуляция, а затем последовательность, все в одной строке):

#! /bin/sh
gawk '{
        if (substr($1,1,1)==">")
        if (NR>1)
                    printf "\n%s\t", substr($0,2,length($0)-1)
        else 
            printf "%s\t", substr($0,2,length($0)-1)
        else 
                printf "%s", $0
}END{printf "\n"}'  "$@"

TblToFasta

Это делает обратное, берет файл в tbl формате и преобразует его в корректный быстрый файл (> заголовок и 60 символов в строке):

#! /bin/sh

gawk '{
  sequence=$NF

  ls = length(sequence)
  is = 1
  fld  = 1

# if (fld == 1){printf ">"}

  while (fld < NF)
  {
     if (fld == 1){printf ">"}
     printf "%s " , $fld

     if (fld == NF-1)
      {
        printf "\n"
      }
      fld = fld+1
  }

  while (is <= ls)
  {
    printf "%s\n", substr(sequence,is,60)
    is=is+60
  }
}' "$@"

Если бы у вас были эти сценарии, вы могли бы сделать то, что вы просили, просто запустив:

$ head -n 1 file.fa; FastaToTbl file.fa | awk -F"\t" '{print $2}'
>1
AAATTTTGGGGCCC
ACCCCGGGTTT..........
ATGCCCCCCCCCC

Или, чтобы получить правильный fasta-файл:

 $ head -n 1 file.fa > newfile; FastaToTbl file.fa | 
    awk -F"\t" '{printf "%s", $2}' | TblToFasta >> newfile   

Который производит:

>1
AAATTTTGGGGCCCACCCCGGGTTT..........ATGCCCCCCCCCC
2
27.01.2020, 21:54
{ echo '>1'; tr -dc '[:alpha:]'; } <infile >outfile

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

1
27.01.2020, 21:54

Теги

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