我有多个名为的文件
Genus_species_strain.fasta
我想用sed打印出来:
Genus
species
strain
我想使用";印刷的";像这样的命令中的单词(prokka是基因组注释的工具(:
prokka $file --outdir `echo $file | sed s/.fasta//` --genus `echo $file | sed s/_.*.fasta//` --species `echo $file | sed <something here>` --strain `echo $file | sed <something here>`
我将感谢你的帮助。我对这一切都很陌生,正如你在上面看到的,我只知道如何打印Genus
。
下面我还有一些额外的问题(如果这只会使事情进一步复杂化,则无需回答这些问题(。这是我打印species
的尝试之一,问题如下:
sed s/.*_//1 | sed s/_.*.fasta//
我知道第二个命令不正确。我认为它需要从第二个
_
开始,但我不知道如何做到这一点,因为延续(即.fasta
(是唯一的。单独使用时,
sed s/.*_//1
返回strain.fasta
。如何使其不跳过第一个_
?组合命令(如您所见,或与
;
组合(似乎对我不起作用
您可以使用字符串拆分和字符串操作:
file='Genus_species_strain.fasta'
IFS='[_.]' read -r genus species strain _ <<< "$file"
outdir="${file%.*}"
然后您可以使用命令中的变量:
prokka "$file" --outdir "$outdir" --genus "$genus" --species "$species" --strain "$strain"
查看此在线演示:
#!/bin/bash
file='Genus_species_strain.fasta'
IFS='[_.]' read -r genus species strain _ <<< "$file"
echo "${file%.*}" # outdir
echo "$genus"
echo "$species"
echo "$strain"
输出:
Genus_species_strain
Genus
species
strain
不设置多个变量的一行使用sed捕获组:一行
file='Genus_species_strain.fasta'
$(echo "$file" | sed "s/(^[^_]*)_([^_]*)_([^_]*).(.*)/prokka "$(echo "$file")" --outdir 4 --genus 1 --species 2 --strain 3/")
使用Bash字符串操作:一行
file='Genus_species_strain.fasta'
$(echo prokka "$file" --outdir `echo "${file#*.}"` --genus `echo "${file%%_*}"` --species "$(echo `file=${file#*_} && echo "${file%%_*}"`)" --strain "$(echo `file=${file#*_} && file=${file#*_} && echo "${file%%.*}"`)")
敬畏一行
file='Genus_species_strain.fasta'
$(echo "$file" | awk -F [_.] -v var="$file" '{print "prokka " $var " --outdir " $4 " --genus " $1 " --species " $2 " --strain " $4}')
现在,您可以在循环中使用上述命令,也可以与文件变量指向文件名的xargs一起使用。它将创建一个prokka命令并直接评估/执行它
希望它对你有用。如果更有效,接受答案
使用sed
$ file=path_to_file
$ sed "s/(([^_]*)_([^_]*)_([^.]*)).*/prokka $file --outdir 1 --genus 2 --species 3 --strain 4/e" <(echo *.fasta)
命令执行的输出
prokka path_to_file --outdir Genus_species_strain --genus Genus --species species --strain strain