读取unix和run命令中的文件列表

use*_*734 7 unix bash loops list fastq

我是shell脚本的新手,我一整天都在努力弄清楚如何执行"for"命令.基本上,我想要做的是以下内容:

我有一个list.txt文件,其中包含一堆名称:

name1
name2
name3
Run Code Online (Sandbox Code Playgroud)

对于列表中的每个名称,有两个不同的文件,每个文件的名称结尾不同.例如:

name1_R1
name1_R2
Run Code Online (Sandbox Code Playgroud)

我试图运行的程序被调用sickle.基本上,它需要两个文件(彼此对应)并对它们进行分析,因此需要我有这个命名方案.镰刀命令如下:

sickle pe -f input_file1.fastq -r input_file2.fastq -t sanger \
Run Code Online (Sandbox Code Playgroud)

如果有人可以帮助我,至少只是告诉我如何让unix读取文件列表并独立处理每一行,我想我可以从那里开始.我尝试了一些东西,但没有一个能奏效.

Jon*_*ler 14

有几种方法可以做到这一点.由于数据文件中的名称是"每行一个",我们可以假设文件名中没有换行符.

for

for file in $(<list.txt)
do
    sickle pe -f "${file}_file1.fastq" -r "${file}_file2.fastq" -t sanger
done
Run Code Online (Sandbox Code Playgroud)

while 循环 read

while read file
do
    sickle pe -f "${file}_file1.fastq" -r "${file}_file2.fastq" -t sanger
done < list.txt
Run Code Online (Sandbox Code Playgroud)

for只有在名称中没有空格(或者没有其他空白字符,例如制表符)时,循环才有效.该while环是干净的,只要你没有在名称换行,虽然使用while read -r file会给你应对不可预知的甚至更好的保护.for循环中文件名周围的双引号是装饰性的(但无害),因为文件名不能包含空格,但while循环中的那些文件名阻止包含空格的文件名在不应拆分时被拆分.每次使用变量时引用变量通常都是一个好主意,尽管严格地说只有当变量可能包含空格但你不希望值分开时才有意义.

我不得不猜测应该将哪些名称传递给sickle命令,因为你的问题还不清楚 - 我99%肯定我猜错了,但它匹配你的示例命令中的不同后缀,假设基本名称为文件是input.我省略了尾随反斜杠; 它是'逃脱'的角色,并不清楚你真正想要的是什么.