使用sed提取行/文件名的中间部分



我有多个名为的文件

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//
  1. 我知道第二个命令不正确。我认为它需要从第二个_开始,但我不知道如何做到这一点,因为延续(即.fasta(是唯一的。

  2. 单独使用时,sed s/.*_//1返回strain.fasta。如何使其不跳过第一个_

  3. 组合命令(如您所见,或与;组合(似乎对我不起作用

您可以使用字符串拆分和字符串操作:

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

最新更新