使用“read”命令将行作为位置参数传递给 shell 脚本

使用“read”命令将行作为位置参数传递给 shell 脚本

以下文件运行,但没有执行任何操作,但也没有错误......

while read dates; do ./avg_hrly_all_final.sh ${dates}; done < ./dates_all.csv

我在“dates_all.csv”中有一个日期列表,其形式如下:

2005 01
2005 02
2005 03

我调用的脚本“avg_hrly_all_final.sh”通过向其传递 2 个位置参数来工作,例如:

./avg_hrly_all_final.sh 2005 01 

跟进

xargs -n2 ./the_script.sh <./dates_to_pass.csv

OR

while read dates; do ./the_script.sh ${dates}; done <./dates_to_pass.csv

工作,只需确保传递的文件的日期与您运行命令的机器所期望的“行尾”类型相同;)

答案1

这可能是以下人员的工作xargs

printf %s\\n '#!/bin/sh' 'printf "<%s>\n" "$$" "$@"' >avg_hourly.sh
chmod +x ./avg_hourly.sh
xargs -n2 ./avg_hourly.sh <<\IN
2005 01
2005 02
2005 03
IN

xargs默认情况下将按空格分割,并在每个-n2出现的参数时调用一次指定的命令。我只是在那里写了一个小虚拟avg_hourly.sh脚本,它每行打印一个参数,在两端以相同的格式分隔<并遵循其 PID。>以上打印:

<1115>
<2005>
<01>
<1116>
<2005>
<02>
<1117>
<2005>
<03>

...只是为了演示。不过,您可能应该使用<./dates_all.csv而不是我的<<\IN此处文档作为输入。

答案2

如果你有 GNU Parallel,你可以这样做:

parallel --colsep ' ' ./avg_hrly_all_final.sh {1} {2} :::: ./dates_all.csv

如果 csv 文件的第一行是标题,您可以执行以下操作:

parallel --header : --colsep ' ' ./avg_hrly_all_final.sh {Year} {Month} :::: ./dates_all.csv

GNU Parallel 是一个通用并行器,可以轻松地在同一台计算机或多台您可以通过 ssh 访问的计算机上并行运行作业。

如果您想要在 4 个 CPU 上运行 32 个不同的作业,则并行化的直接方法是在每个 CPU 上运行 8 个作业:

简单的调度

相反,GNU Parallel 在完成后会生成一个新进程 - 保持 CPU 处于活动状态,从而节省时间:

GNU 并行调度

安装

如果您的发行版未打包 GNU Parallel,您可以进行个人安装,不需要 root 访问权限。这样做可以在 10 秒内完成:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

对于其他安装选项,请参阅http://git.savannah.gnu.org/cgit/parallel.git/tree/README

了解更多

查看更多示例:http://www.gnu.org/software/parallel/man.html

观看介绍视频:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

浏览本教程:http://www.gnu.org/software/parallel/parallel_tutorial.html

注册电子邮件列表以获得支持:https://lists.gnu.org/mailman/listinfo/parallel

相关内容