首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在循环中不使用do命令两次执行命令

如何在循环中不使用do命令两次执行命令
EN

Stack Overflow用户
提问于 2021-12-20 08:51:05
回答 1查看 22关注 0票数 0

这些是我的档案

代码语言:javascript
复制
KIMS2021-01_R1.fastq.gz  KIMS2021-05_R1.fastq.gz  SRR1734376_1.fastq.gz  SRR6006897_1.fastq.gz  SRR6006901_1.fastq.gz  SRR6006905_1.fastq.gz
KIMS2021-01_R2.fastq.gz  KIMS2021-05_R2.fastq.gz  SRR1734376_2.fastq.gz  SRR6006897_2.fastq.gz  SRR6006901_2.fastq.gz  SRR6006905_2.fastq.gz
KIMS2021-02_R1.fastq.gz  KIMS2021-06_R1.fastq.gz  SRR1734377_1.fastq.gz  SRR6006898_1.fastq.gz  SRR6006902_1.fastq.gz  SRR6006906_1.fastq.gz
KIMS2021-02_R2.fastq.gz  KIMS2021-06_R2.fastq.gz  SRR1734377_2.fastq.gz  SRR6006898_2.fastq.gz  SRR6006902_2.fastq.gz  SRR6006906_2.fastq.gz
KIMS2021-03_R1.fastq.gz  SRR1734374_1.fastq.gz    SRR6006895_1.fastq.gz  SRR6006899_1.fastq.gz  SRR6006903_1.fastq.gz
KIMS2021-03_R2.fastq.gz  SRR1734374_2.fastq.gz    SRR6006895_2.fastq.gz  SRR6006899_2.fastq.gz  SRR6006903_2.fastq.gz
KIMS2021-04_R1.fastq.gz  SRR1734375_1.fastq.gz    SRR6006896_1.fastq.gz  SRR6006900_1.fastq.gz  SRR6006904_1.fastq.gz
KIMS2021-04_R2.fastq.gz  SRR1734375_2.fastq.gz    SRR6006896_2.fastq.gz  SRR6006900_2.fastq.gz  SRR6006904_2.fastq.gz

要为每对得到统一的文件名,我从前面的问题中得到了这个答案,这是

代码语言:javascript
复制
for i in $(echo *.fastq*.gz); do echo ${i%_*}; done | uniq

我想在获得统一文件名后使用的最后一个命令

代码语言:javascript
复制
for i in $(ls *.fastq*.gz); do echo ${i%_*}; done | uniq; do STAR --runMode alignReads --outSAMtype BAM SortedByCoordinate --runThreadN 30 --genomeDir /run/media/punit/data3/Santosh_star_index --readFilesIn  <(gunzip -c ${i}_R1.fastq.gz ${i}_R2.fastq.gz ) --outFileNamePrefix ${i%};done

现在我知道我不能在一个循环中两次使用do

如何在不使用do的情况下将统一文件名传递给我的命令

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-20 08:58:20

来自我上一个问题,这是

首先,让我们把它修好!不要做:

代码语言:javascript
复制
for i in $(anything); do

只要做:

代码语言:javascript
复制
for i in *.fastq*.gz; do

如何将统一文件名传递给我的命令

最重要的是,Shell与管道|一起工作。一个命令的输出与管道中的另一个命令类似,for循环的输出是uniq的输入。

读取uniq的输出。

代码语言:javascript
复制
for i in *.fastq*.gz; do echo "${i%_*}"; done |
   uniq |
   while IFS= read -r file; do stuff with "$file"; done

使用shellcheck.net检查您的脚本。请参阅https://mywiki.wooledge.org/BashFAQ/001

作为一名生物学家,这对我来说是一件痛苦的事,请深入了解脚本的基本细节,我的简单解决方案是,如果我将它们作为两个集合运行的话

好的!我经常在交互式脚本编写时这样做。

代码语言:javascript
复制
tmp=$( for i in *.fastq*.gz; do echo "${i%_*}"; done )
tmp=$( uniq <<<"$tmp" )   # or tmp=$( echo "$tmp" | uniq )
tmp=$( echo "$tmp" | while IFS= read -r file; do stuff with "$file"; done )
echo "$tmp"

请记住,qoutes "<<<"stuff"的工作方式类似于<file --将"stuff"的内容输入到命令的输入中,与echo "$tmp" |一样。

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

https://stackoverflow.com/questions/70419345

复制
相关文章

相似问题

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