bash - 读取 unix 上的文件列表并运行命令

标签 bash list loops unix fastq

我是 shell 脚本的新手,我一整天都在努力弄清楚如何执行“for”命令。本质上,我想做的是:

我有一个包含一堆名字的 list.txt 文件:

name1
name2
name3

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

name1_R1
name1_R2

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

sickle pe -f input_file1.fastq -r input_file2.fastq -t sanger \

如果有人可以帮助我,至少只是告诉我如何让 unix 读取文件列表并独立处理每一行,我想我可以从那里开始。我尝试了一些方法,但都没有用。

最佳答案

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

for 循环

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

while 循环 read

while read file
do
    sickle pe -f "${file}_file1.fastq" -r "${file}_file2.fastq" -t sanger
done < list.txt

for 循环仅在名称中没有空格(也没有其他空白字符,如制表符)时才有效。只要名称中没有换行符,while 循环就是干净的,尽管使用 while read -r file 可以更好地防止意外情况发生。 for 循环中文件名周围的双引号是装饰性的(但无害),因为文件名不能包含空格,但 while 循环中的双引号防止文件名包含空格在不应该 split 的时候被 split 。每次使用变量时都引用它们通常是个好主意,尽管严格来说只有当变量可能包含空格但您不希望值被拆分时才重要。

我不得不猜测应该将哪些名称传递给 sickle 命令,因为您的问题不清楚——我 99% 确定我猜错了,但它与示例命令中的不同后缀假设文件的基本名称是 input。我省略了结尾的反斜杠;它是“转义”字符,不清楚您真正想要的是什么。

关于bash - 读取 unix 上的文件列表并运行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18028643/

相关文章:

bash - grep 文件中不同行的多个字符串(即整个文件,而不是基于行的搜索)?

java - 在 Java 中写入 CSV 文件的子字符串问题

c# - 遍历 List<interface> 项

C++通过迭代器访问指向对象成员的指针列表

linux - 比较 2 个 jar 文件中的文件名?

linux - 将文件中读取的路径存储在变量中(脚本 shell)

linux - 如何从目录压缩中输出base64

有人能告诉我为什么这个程序总是崩溃吗?

c - 如何在不使用 "goto"的情况下摆脱这个深层嵌套的循环?

java - for 循环(Java)