首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >linux for每次循环两个变量

linux for每次循环两个变量
EN

Stack Overflow用户
提问于 2017-11-01 11:39:45
回答 2查看 40关注 0票数 0

我在一个目录中有几个文件,我想每隔两个文件就在这些文件上运行一些linux包,比如使用ERR1045141_2的ERR1045141_1和使用ERR1045144_2的ERR1045144_1等等。因此,我为此编写了一个for循环,但它不起作用。

代码语言:javascript
运行
复制
files:
ERR1045141_1.fastq.gz
ERR1045141_2.fastq.gz
ERR1045144_1.fastq.gz
ERR1045144_2.fastq.gz
ERR1045145_1.fastq.gz
ERR1045145_2.fastq.gz
ERR1045146_1.fastq.gz
ERR1045146_2.fastq.gz
ERR1045148_1.fastq.gz
ERR1045148_2.fastq.gz
ERR1045149_1.fastq.gz
ERR1045149_2.fastq.gz
ERR1045151_1.fastq.gz
ERR1045151_2.fastq.gz
ERR1045152_1.fastq.gz
ERR1045152_2.fastq.gz
ERR1045154_1.fastq.gz
ERR1045154_2.fastq.gz

codes:
files=ls
for (( i=0; i<${#files[@]} ; i+=2 )) ; do
echo "${files[i]}" "${files[i+1]}"
done

它没有工作,我不确定是不是files=ls有wrong.Or任何更好的方式来做it.please建议。

EN

回答 2

Stack Overflow用户

发布于 2017-11-01 12:12:49

如果您确定存在第二个文件,请尝试以下操作:

代码语言:javascript
运行
复制
for file1 in ERR*_1*
do
file2=`echo $file1 | sed 's/_1/_2/g'`
echo $file1 $file2
done
票数 0
EN

Stack Overflow用户

发布于 2017-11-01 12:46:40

不,您真正想要做的是处理所有的1文件,对它及其关联的2文件执行一些操作。

您可以在这个完整的测试程序中使用像for循环这样简单的东西来做到这一点:

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

doSomethingWith() {
    echo "[$1] [$2]"
}

touch 'xERR1045141_1.fastq.gz' 'xERR1045141_2.fastq.gz'
touch 'xERR1045144_1.fastq.gz' 'xERR1045144_2.fastq.gz'
touch 'xERR1045145_1.fastq.gz' 'xERR1045145_2.fastq.gz'
touch 'xERR1045146_1.fastq.gz' 'xERR1045146_2.fastq.gz'
touch 'xERR1045148_1.fastq.gz' 'xERR1045148_2.fastq.gz'
touch 'xERR1045149_1.fastq.gz' 'xERR1045149_2.fastq.gz'
touch 'xERR1045151_1.fastq.gz' 'xERR1045151_2.fastq.gz'
touch 'xERR1045152_1.fastq.gz' 'xERR1045152_2.fastq.gz'
touch 'xERR1045154_1.fastq.gz' 'xERR1045154_2.fastq.gz'
touch 'xERR  45154_1.fastq.gz' 'xERR  45154_2.fastq.gz'

for file1 in xERR*_1.fastq.gz ; do
    file2="${file1/_1/_2}"
    doSomethingWith "${file1}" "${file2}"
done

rm -rf xERR*.fastq.gz

此程序输出:

代码语言:javascript
运行
复制
[xERR1045141_1.fastq.gz] [xERR1045141_2.fastq.gz]
[xERR1045144_1.fastq.gz] [xERR1045144_2.fastq.gz]
[xERR1045145_1.fastq.gz] [xERR1045145_2.fastq.gz]
[xERR1045146_1.fastq.gz] [xERR1045146_2.fastq.gz]
[xERR1045148_1.fastq.gz] [xERR1045148_2.fastq.gz]
[xERR1045149_1.fastq.gz] [xERR1045149_2.fastq.gz]
[xERR1045151_1.fastq.gz] [xERR1045151_2.fastq.gz]
[xERR1045152_1.fastq.gz] [xERR1045152_2.fastq.gz]
[xERR1045154_1.fastq.gz] [xERR1045154_2.fastq.gz]
[xERR  45154_1.fastq.gz] [xERR  45154_2.fastq.gz]

以显示名称正在被正确处理。

请注意,我已将文件命名为xERR*,以免与您自己的文件冲突。您应该调整循环来处理您自己的文件,一旦您满意它将正常工作。

顺便说一句,如果你不想做任何事情,除了两个文件都存在的情况,你可以简单地用下面的代码替换"action“行:

代码语言:javascript
运行
复制
[[ -f "${file2}" ]] && doSomethingWith "${file1}" "${file2}"

这将绕过2文件不是常规文件的那些文件。

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

https://stackoverflow.com/questions/47047870

复制
相关文章

相似问题

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