如何将具有多个标头的文件连接成一个

如何将具有多个标头的文件连接成一个

你能建议我如何结合吗?

a.fasta 具有 10000 个序列,其中包含标头 1, 2, 3, .... 10000 .......................仅包含一个标头,例如

>1
AAATTTTGGGGCCC
>2
ACCCCGGGTTT
..........
>10000
ATGCCCCCCCCCC

输出:

>1
AAATTTTGGGGCCCACCCCGGGTTTATGCCCCCCCCCC

答案1

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

答案2

最简单的方法是只打印第一行,然后打印文件中不包含 i) 任何空格字符(它们与 fasta 文件无关)和 ii) fasta 标题行 ( >) 的所有其他行:

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

打印第一行,并且 grep 正则表达式从行的开头 ( ) 到结尾 ( )head查找仅包含非字符>和非空格字符 ( ) 的所有行。[^> ]^$

但是,这将产生如下文件:

>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):

快速转Tbl

该脚本获取一个 fasta 文件并将其更改为 tbl 格式(fasta 标头、制表符和序列,全部在一行上):

#! /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 格式的文件并将其转换为正确的 fasta 文件(>标题和每行 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

答案3

{ echo '>1'; tr -dc '[:alpha:]'; } <infile >outfile

您不需要从文件中获取第一行 - 只需echo获取标题即可。如果您删除除字母字符之外的所有内容,那么您就会自动获得您想要的内容。

相关内容