使用file中的参数进行并行处理

时间:2018-06-04 02:04:21

标签: bash gnu-parallel

我有一个包含10个应用程序信息(app id,api密钥和密钥)的10行文件 apps.txt 。文件每行中的字段是与服务器交互的程序的参数。另一个文件 data.txt 包含作为程序输入的数据。我希望程序为apps.txt中的每一行启动一个实例,并将data.txt拆分为要处理的应用程序数。如何使用 GNU Parallel 来做到这一点? 我尝试了下面的命令,但无法获得所需的行为:

cat data.txt | parallel [-N1] -j10 --pipe --no-run-if-empty --line-buffer ./program.py {1} {2} {3} :::: apps.txt

apps.txt
    AppID1 API_Key1 Secret_Key1
    AppID2 API_Key2 Secret_Key2
    ...
    AppID10 API_Key10 Secret_Key10

2 个答案:

答案 0 :(得分:2)

我以你有10个工人的方式解释你的问题,并且你想要将stdin的块分发给那些人。

使用GNU Parallel的插槽替换字符串,并且有一个数组,索引是worker的信息。 Bash的数组从0开始计算索引,因此从slot()中减去1。

# Set each entry in array 'worker' to one line from apps
parset worker echo :::: apps.txt
doit() {
  workerid="$1"
  echo "do stuff on ${worker[$workerid]}"
  # Read stuff from stdin and do 'wc' on that
  wc
}
# env_parallel is needed to get $worker exported
# -j10 must be the number of lines in apps.txt
cat data.txt | env_parallel -j10 --pipe doit '{= $_=slot()-1 =}'

答案 1 :(得分:0)

我真的不明白你对data.txt的看法。我只知道:

  1. 拆分文件

    $ split -l 10 data.txt -d -a 4 split_file

    此命令将根据行数(10)从data.txt生成{split_file000,split_file001,...}。

  2. 拆分并传递命令

    $ cat app.txt | xargs -n 3 ./program.py

    此命令等于:

    $ ./program.py APPID1 APP_KEY1 SECRET_KEY1

    $ ./program.py APPID2 APP_KEY2 SECRET_KEY2

    $ ...