首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Bash:尝试在函数的输出中追加变量名

Bash:尝试在函数的输出中追加变量名
EN

Stack Overflow用户
提问于 2014-05-30 11:27:46
回答 2查看 783关注 0票数 3

这是我关于Stackoverflow的第一篇文章,我应该指出,我对许多编程非常陌生。我目前是一名研究生,做的项目涉及到各种程序的编码,从LaTeX到bash,MATLAB等等。

如果你能明确地解释你的答案,那将是非常感激的,因为我正在努力学习。我很抱歉,如果有其他的答案,在哪里做我想要做的,但我已经花了几天寻找现在。

因此,对于我想要解决的问题:我目前正在使用一些生物信息学工具来分析一系列基因组,并且我试图在一定程度上实现这个过程的自动化。

例如,我有几个名称类似于此的序列(它们都包含在自己的文件夹中,目前都是成对的文件):

代码语言:javascript
运行
复制
SOL2511_S5_L001_R1_001.fastq
SOL2511_S5_L001_R2_001.fastq
SOL2510_S4_L001_R1_001.fastq
SOL2510_S4_L001_R2_001.fastq

...and等等..。

基本上,我希望通过将这些变量提交给变量并将这些变量传递给我所使用的每个程序来实现过程的自动化。例如,到目前为止,我的想法是将它们指定为通配符,使用R1和R2 (它们出现在所有文件名中,因为它们代表每一条DNA)如下:

代码语言:javascript
运行
复制
#!/bin/bash

seq1=*R1_001*
seq2=*R2_001*

在最基本的级别上,这是工作的,因为它返回正确的文件,所以现在我将这些变量传递给我的第一个函数,该函数将DNA序列缩减到指定的数量,如下所示:

代码语言:javascript
运行
复制
# seqtk is the program suite, trimfq is a function within it, 
# and the options -b -e specify how many bases to trim from the beginning and end of     
# the DNA sequence respectively. 

seqtk trimfq -b 10 -e 20 $seq1 > 
seqtk trimfq -b 10 -e 20 $seq2 > 

因此,现在我的问题是,我希望能够将类似于“”的内容添加到输出文件中,该文件出现在"_trim“之后,但我找不到任何似乎可以在线运行的内容。

或者,我一直在寻找一个脚本,该脚本将使用文件所在的文件夹的名称,并为文件夹名创建一个变量,然后我可以将该变量分配给有关函数,以便所有输出文件的命名都是正确的,以便稍后使用。

非常感谢您的帮助,我很抱歉,这并不是一个最低限度的工作例子,因为我只是开始所有这些东西!

编辑

因此,我修改了@ghoti的for循环(我可以为您添加一个非常好的工作,代表您:D ),现在我添加了trim_,因为以前的循环最终给了我一个.fastq.trim,这会在以后导致错误。

是否可以在扩展名之前将_trim追加到文件名的末尾?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-30 11:39:45

当匹配文件名时,显式通常比隐含的要好。您的通配符可能比您预期的更匹配,特别是如果您的文件版本的"_trim“附加在末尾!

我将更精确地使用通配符,并使用for循环来处理文件,而不是依赖seqtk来处理多个文件。这样,您就可以对文件名进行自己的处理。

下面是一个例子:

代码语言:javascript
运行
复制
#!/bin/bash

# Define an array of sequences
sequences=(R1_001 R2_001)

# Step through the array...
for seq in ${sequences[@]}; do

  # Step through the files in this sequence...
  for file in SOL*_${seq}.fastq; do
    seqtk trimfq -b 10 -e 20 "$file" > "${file}.trim"
  done

done

我不知道你的文件夹是如何设置的,所以我还没有在这个脚本中解决这个问题。但是,基本思想是,如果您希望脚本能够操作单个文件名,您需要类似于for循环的东西来处理基于每个文件名的操作。

这个有用吗?

更新:

若要将_trim放在扩展之前,请将seqtk行替换为以下内容:

代码语言:javascript
运行
复制
    seqtk trimfq -b 10 -e 20 "$file" > "${file%.fastq}_trim.fastq"

这使用了在Parameter Expansion下的Bash手册页面中记录的内容,如果您想要阅读它。基本上,${file%.fastq}取下$file变量并去掉一个后缀。然后,我们添加额外的文本和后缀。

您也可以使用basename(1)删除扩展,但是当您可以使用内置到shell中的东西时,不需要调用外部的东西。

票数 2
EN

Stack Overflow用户

发布于 2014-05-30 11:43:31

与使用文件名设置变量不同,您可以将ls的输出输送到要使用这些文件名运行的命令中,如下所示:

代码语言:javascript
运行
复制
ls *R{1,2}_001* | xargs -I@ sh -c 'seqtk trimfq -b 10 -e 20 "$1" > "${1}_trim"' -- @

xargs -I@将获取前面命令的输出,并将其存储在@中,供seqtk使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23953504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档