我对 shell 脚本很陌生,所以如果之前有人问过这个问题,我深表歉意。
我有一个像这样的文件坐标.txt:
765442
866447
755343
097754
我想将文件每一行的每个值传递给一个变量,并逐一使用这些值作为命令行中的输入,并将该数字保存在文件名的一部分中。我编写了以下代码,但不确定这是否是正确的方法......
cat coordinates.txt | while read LINE; do
var="$(echo $LINE)"
/home/users/scripts/TreeView/TreeView.sh -o $NAME_ALL.chr1.new_estimate.trees.$var --bp_of_interest $var
done
因此,在输出 -o 中,每个值一次附加一个到文件名,并且每个值也用作 --bp_of_interest,一次一个
任何建议都将受到高度赞赏。谢谢
答案1
你的循环最好写成
PATH=/home/users/scripts/TreeView:$PATH
while IFS= read -r line; do
TreeView.sh -o "$name_all.chr1.new_estimate.trees.$line" --bp_of_interest "$line"
done <coordinates.txt
这会改变以下内容:
- 我加到
/home/users/scripts/TreeView
前面了$PATH
。这使我们可以TreeView.sh
在不添加绝对路径的情况下进行调用。 - 我删除了该
var
变量,因为它与从输入文件读取的值相同。 - 我使用是
IFS= read -r line
因为“理解“IFS=读取-r行””。 - 我使用小写变量名是因为“shell 脚本中的变量有命名约定吗?”。
- 我通过重定向将文件中的数据传递到循环中,因为
cat
在本例中不需要使用。
做同样事情的另一种方法:
PATH=/home/users/scripts/TreeView:$PATH
xargs -I {} TreeView.sh -o "$name_all.chr1.new_estimate.trees.{}" --bp_of_interest "{}" <coordinates.txt
这用于xargs
将从 的每一行读取的数据插入coordinates.txt
到脚本参数TreeView.sh
中由 表示的位置{}
。
您甚至可以添加-P n
到xargs
命令行(例如 before -I {}
,其中n
是某个数字)以一次运行脚本的多个并行实例,每个实例都将适当的数据插入到其命令行中coordinates.txt
。