将文件中的多行合并到单行文件中跳过标题

问题描述:

我在文件夹中有几千个文件。每个文件的内容如下所示。我在这个例子中的文件名是:AAB08704.1.fasta将文件中的多行合并到单行文件中跳过标题

>gi|1117824|gb|AAB08704.1| ecdysteroid regulated 16 kDa [Manduca sexta] 
    MLFYITVTVLLVSAQAKFYTDCGSKLATVQSVGVSGWPENARECVLKRNSNVTISIDFSPTTDVSAITTE 
    VHGVIMSLPVPFPCRSPDACKDNGLTCPIKAGVVANYKTTLPVLKSYPKVSVDVKWELKKDEEDLVCILI 
    PARIH 

我想跳过第一行,然后将余下线合并成一条线。我所有的文件都以“>”开头,这是标题信息,以下几行是我想合并成一行的序列信息。

我试图

sed -i '2,$s/\n//g' AAB08704.1.fasta 

我甚至尝试多FASTA转换为单行FASTA使用:

awk '/^>/ {printf("\n%s\n",$0);next; } { printf("%s",$0);} END {printf("\n");}' < AAB08704.1.fasta 

这两个命令没有做什么,我的期望。任何线索?

预期输出:

>gi|1117824|gb|AAB08704.1| ecdysteroid regulated 16 kDa [Manduca sexta] 
    MLFYITVTVLLVSAQAKFYTDCGSKLATVQSVGVSGWPENARECVLKRNSNVTISIDFSPTTDVSAITTEVHGVIMSLPVPCRSPDACKDNGLTCPIKAGVVANYKTTLPVLKSYPKVSVDVKWELKKDEEDLVCILIPARIH 

猫-A AAB08704.1.fasta给出了这样的:

M-oM-;M-?>gi|1117824|gb|AAB08704.1| ecdysteroid regulated 16 kDa [Manduca sexta]^M$ 
    MLFYITVTVLLVSAQAKFYTDCGSKLATVQSVGVSGWPENARECVLKRNSNVTISIDFSPTTDVSAITTE^M$ 
    VHGVIMSLPVPFPCRSPDACKDNGLTCPIKAGVVANYKTTLPVLKSYPKVSVDVKWELKKDEEDLVCILI^M$ 
+0

现在又增加了我的预期输出。 – biobudhan

随着perl

$ perl -pe 's/\n// if $. > 1 && !eof' AAB08704.1.fasta 
>gi|1117824|gb|AAB08704.1| ecdysteroid regulated 16 kDa [Manduca sexta] 
MLFYITVTVLLVSAQAKFYTDCGSKLATVQSVGVSGWPENARECVLKRNSNVTISIDFSPTTDVSAITTEVHGVIMSLPVPFPCRSPDACKDNGLTCPIKAGVVANYKTTLPVLKSYPKVSVDVKWELKKDEEDLVCILIPARIH 
  • s/\n//删除换行符
    • if $. > 1 && !eof只有当行号文件
  • 使用perl -i -pe大于一个,而不是结束对就地编辑。见Command Switches的文档上-i-p-e
+0

可悲的是,它并没有取代新的一行字符。我仍然得到与我的输入文件相同的输出。看起来像我的文件有一个格式问题。任何导致强制替代? – biobudhan

+0

你能粘贴'cat -A AAB08704.1.fasta'的输出吗?我认为你的文件可能有'\ r \ n'而不是'\ n'作为结尾 – Sundeep

+0

是的,现在添加。 – biobudhan

喜欢这个?用于GNU AWK:

$ awk '{p=p $0 (FNR==1?ORS:"")}ENDFILE{print p;p=""}' file file 
>gi|1117824|gb|AAB08704.1| ecdysteroid regulated 16 kDa [Manduca sexta] 
MLFYITVTVLLVSAQAKFYTDCGSKLATVQSVGVSGWPENARECVLKRNSNVTISIDFSPTTDVSAITTEVHGVIMSLPVPFPCRSPDACKDNGLTCPIKAGVVANYKTTLPVLKSYPKVSVDVKWELKKDEEDLVCILIPARIH 
>gi|1117824|gb|AAB08704.1| ecdysteroid regulated 16 kDa [Manduca sexta] 
MLFYITVTVLLVSAQAKFYTDCGSKLATVQSVGVSGWPENARECVLKRNSNVTISIDFSPTTDVSAITTEVHGVIMSLPVPFPCRSPDACKDNGLTCPIKAGVVANYKTTLPVLKSYPKVSVDVKWELKKDEEDLVCILIPARIH 

这一个>之前移除所述第一记录中的所有字符:

$ awk 'FNR==1{sub(/^[^>]*/,"");p=$0 ORS;next}{p=p $0}ENDFILE{print p;p=""}' file file 
>gi|1117824|gb|AAB08704.1| ecdysteroid regulated 16 kDa [Manduca sexta] 
MLFYITVTVLLVSAQAKFYTDCGSKLATVQSVGVSGWPENARECVLKRNSNVTISIDFSPTTDVSAITTEVHGVIMSLPVPFPCRSPDACKDNGLTCPIKAGVVANYKTTLPVLKSYPKVSVDVKWELKKDEEDLVCILIPARIH 
>gi|1117824|gb|AAB08704.1| ecdysteroid regulated 16 kDa [Manduca sexta] 
MLFYITVTVLLVSAQAKFYTDCGSKLATVQSVGVSGWPENARECVLKRNSNVTISIDFSPTTDVSAITTEVHGVIMSLPVPFPCRSPDACKDNGLTCPIKAGVVANYKTTLPVLKSYPKVSVDVKWELKKDEEDLVCILIPARIH 
+0

我现在更新了我的预期输出 – biobudhan

+0

没有错别字,只用一个模拟多个文件。 –

+1

@Sundeep它有意地打印两次'file',因为在awk代码之后两次提到'file'。OP开始于:_I有数千个文件_,我认为@biobudhan不想在当时处理一个文件,因此我的解决方案会处理所有作为参数给出的文件。但是,输出没有要求(每个输出分开文件等),因此它将所有内容输出到stdout。如果你测试其他解决方案的问题,他们很可能会失败,如果给予更多的文件一次处理,所以他们需要在一个shell循环内运行。 –

sed的是面向行的,所以需要在缓冲液中加载线比除去\n

sed -i -e '1d' -e 'H;${x;s/\n//g}' AAB08704.1.fasta 

awk可能适应行为

awk 'BEGIN{FS="\n";RS="()";OFS=""}{$1="";$0=$0 ""}' AAB08704.1.fasta > tmp && mv tmp AAB08704.1.fasta 

# or 
awk '!a++{next}{printf("%s", $0) > (FILENAME ".tmp")}' AAB08704.1.fasta && mv AAB08704.1.fasta.tmp AAB08704.1.fasta 
# or 
awk 'NR>1{printf("%s",$0)}' AAB08704.1.fasta > tmp && mv tmp AAB08704.1.fasta 
+0

我现在更新了我的预期输出 – biobudhan

+0

awk方法只是删除我的文件的内容。 – biobudhan

+0

对不起awk,我只是混合使用2版本的代码(RS在第二版中使用)。改编 – NeronLeVelu

这也适用于:

awk 'BEGIN{ ORS = "" }/^>/{ print $0, "\n"}NR>1{ print $0 }' file 

输出:

>gi|1117824|gb|AAB08704.1| ecdysteroid regulated 16 kDa [Manduca sexta] 
MLFYITVTVLLVSAQAKFYTDCGSKLATVQSVGVSGWPENARECVLKRNSNVTISIDFSPTTDVSAITTEVHGVIMSLPVPFPCRSPDACKDNGLTCPIKAGVVANYKTTLPVLKSYPKVSVDVKWELKKDEEDLVCILIPARIH