fasta 文件:用文件名替换 header
fasta file: replace header with filename
我想用 >{filename}
替换我的 directory
中所有 *.fasta
文件中的所有 headers(从 >
开始)并连接它们之后
我的内容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 ...]
我哪里弄错了??
在sed
中您需要使用双引号进行变量扩展。否则,它们将被视为文字文本。
for file in *.fasta;
do
sed -i "s/>.*/${file%%.*}/" "$file" ;
done
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 的神秘 shorthand 打印行。
例子
让我们考虑一个包含两个(相同)测试文件的目录:
$ 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
输出具有替换并连接所有输入文件。
我想用 >{filename}
替换我的 directory
中所有 *.fasta
文件中的所有 headers(从 >
开始)并连接它们之后
我的内容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 ...]
我哪里弄错了??
在sed
中您需要使用双引号进行变量扩展。否则,它们将被视为文字文本。
for file in *.fasta;
do
sed -i "s/>.*/${file%%.*}/" "$file" ;
done
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 的神秘 shorthand 打印行。
例子
让我们考虑一个包含两个(相同)测试文件的目录:
$ 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
输出具有替换并连接所有输入文件。