fasta文件:用文件名

时间:2017-06-01 05:46:18

标签: bash sed fasta

我想在>内的所有>{filename}个文件中替换所有标题(以*.fasta开头)directory,然后将它们连接起来

我的directory

的内容
speciesA.fasta
speciesB.fasta
speciesC.fasta

文件示例speciesA.fasta

>protein1 description
MJSUNDKFJSKFJSKFJ
>protein2 anothername
KEFJKSDJFKSDJFKSJFLSJDFLKSJF
>protein3 somewordshere
KSDAFJLASDJFKLAJFL

我想要的输出(仅适用于speciesA.fasta):

>speciesA
MJSUNDKFJSKFJSKFJ
>speciesA
KEFJKSDJFKSDJFKSJFLSJDFLKSJF
>speciesA
KSDAFJLASDJFKLAJFL

这是我的代码:

for file in *.fasta; do var=$(basename $file .fasta) | sed 's/>.*/>$var/' $var.fasta >>$var.outfile.fasta; done

但我得到的只是

>$var
MJSUNDKFJSKFJSKFJ
>$var
KEFJKSDJFKSDJFKSJFLSJDFLKSJF

[and so on ...]

我在哪里弄错了?

2 个答案:

答案 0 :(得分:2)

bash循环是多余的。尝试:

awk '/^>/{print ">" substr(FILENAME,1,length(FILENAME)-6); next} 1' *.fasta

即使文件名包含特殊字符或正则字符活动字符,此方法也是安全的。

如何运作

  • /^>/ {print ">" substr(FILENAME, 1, length(FILENAME)-6); next}

    对于任何以>开头的行,将执行花括号中的命令。第一个命令打印>,后跟文件名的最后6个字母。第二个命令next会跳过该行的其余命令,并跳转到next行重新开始。

  • 1

    这是awk用于打印线的神秘简写。

实施例

让我们考虑一个包含两个(相同)测试文件的目录:

$ cat speciesA.fasta
>protein1 description
MJSUNDKFJSKFJSKFJ
>protein2 anothername
KEFJKSDJFKSDJFKSJFLSJDFLKSJF
>protein3 somewordshere
KSDAFJLASDJFKLAJFL
$ cat speciesB.fasta
>protein1 description
MJSUNDKFJSKFJSKFJ
>protein2 anothername
KEFJKSDJFKSDJFKSJFLSJDFLKSJF
>protein3 somewordshere
KSDAFJLASDJFKLAJFL

我们命令的输出是:

$ awk '/^>/{print ">" substr(FILENAME,1,length(FILENAME)-6); next} 1' *.fasta
>speciesA
MJSUNDKFJSKFJSKFJ
>speciesA
KEFJKSDJFKSDJFKSJFLSJDFLKSJF
>speciesA
KSDAFJLASDJFKLAJFL
>speciesB
MJSUNDKFJSKFJSKFJ
>speciesB
KEFJKSDJFKSDJFKSJFLSJDFLKSJF
>speciesB
KSDAFJLASDJFKLAJFL

输出具有替换并连接所有输入文件。

答案 1 :(得分:1)

sed中,您需要使用双引号进行变量扩展。否则,它们将被视为文字文本。

for file in *.fasta;
   do
       sed -i "s/>.*/${file%%.*}/" "$file" ;
done