簡體   English   中英

Bash for循環在列表中批量

[英]Bash for loop in batch on list

我正在嘗試 bash 腳本,它根據列表的大小以批處理模式執行以下 java jar 命令。

我有一個包含美國 54 個州的字符串列表。

list = [USA+CA,USA+TX,USA+TN...]

我需要與具有 4 個值的 4 個實例並行執行以下命令作為列表的輸入。

java -jar test-execute.jar --localities=USA+TX,USA+CA,USA+TN,USA+AB

等到任何實例的執行完成,然后啟動具有接下來 4 個狀態的 jar 的新實例。

array=( USA+TX,USA+CA,USA+TN,USA+AB )
for i in "${array[@]}"
do
    java -jar test-execute.jar --localities= ???
done

我無法理解如何動態地將數組中的輸入提供給 jar 執行。

所以,

我有 54 碼的清單,

我需要並行運行 4 個 Java 實例,每個實例具有 4 個唯一狀態作為來自 54 個列表的輸入。,一旦這些實例完成,然后開始下一個 4 個實例,每個實例有下一個唯一的 4 個狀態。

更新:

我有 54 個州的列表,16 個核心機器。 每個 java jar 實例將使用 4 個內核,因此我可以一次運行 4 個 java 實例以使用 16 個內核的機器。

16 core machine 
   java instance-1 4 states
   java instance-2 4 states
   java instance-3 4 states
   java instance-4 4 states
 
wait till any of these instances complete, once completed, start new instance with next 4 states until all 54 states has been executed. 

請幫忙。

首先,必須將bash array分配為以空格分隔的列表,如下所示:

array=("USA+AL" "USA+AK" "USA+AZ" "USA+AR" "USA+AS" "USA+CA" ...)

那么請你嘗試這樣的事情:

array=("USA+AL" "USA+AK" "USA+AZ" "USA+AR" "USA+AS" "USA+CA" ...)
for (( i = 0; i < ${#array[@]}; i+=4 )); do
    echo java -jar test-execute.jar --localities="$(IFS=,; echo "${array[*]:i:4}")"
done
  • for循環具有類似 C 的語法,可將索引遞增 4。
  • 數組切片${array[*]:i:4}將數組分成每四個元素的子數組,從第 i 個索引開始。 最后一個包含兩個元素的塊也被處理。
  • $(IFS=,; echo "${array[*]:i:4}")用逗號連接數組,作為參數提供給java

如果輸出看起來不錯,請將echo放在java前面。

[編輯]
至於並行性,我們可以使用xargs-P選項。 你能試試嗎:

array=("USA+AL" "USA+AK" "USA+AZ" "USA+AR" "USA+AS" "USA+CA" ...)
for (( i = 0; i < ${#array[@]}; i+=4 )); do
    printf "%s\n" "$(IFS=,; echo "${array[*]:i:4}")"
done | xargs -P4 -L1 -I{} java -jar test-execute.jar --localities="{}"
  • 它將四種狀態分組為一個參數。
  • -P4選項一次生成四個進程。
  • 然后一次處理總共16個狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM