따라서 나는 모든 N 줄을 병렬로 성공적으로 읽고 각 줄에서 명령을 실행하는 방법을 이미 알고 있습니다.
while read -r i && read -r a && read -r b && read -r c && read -r d && read -r e && read -r f && read -r g && read -r h && read -r j && read -r k && read -r l && read -r m && read -r n && read -r o && read -r p && read -r q && read -r r && read -r s && read -r t && read -r u && read -r v && read -r w && read -r x && read -r z && read -r aa && read -r bb && read -r cc && read -r dd && read -r ee && read -r ff && read -r gg && read -r hh && read -r ii && read -r jj; do
dosomething "$i" &
dosomething "$a" &
dosomething "$b" &
dosomething "$c" &
dosomething "$d" &
dosomething "$e" &
dosomething "$f" &
dosomething "$g" &
dosomething "$h" &
dosomething "$j" &
dosomething "$k" &
dosomething "$l" &
dosomething "$m" &
dosomething "$n" &
dosomething "$o" &
dosomething "$p" &
dosomething "$q" &
dosomething "$r" &
dosomething "$s" &
dosomething "$t" &
dosomething "$u" &
dosomething "$v" &
dosomething "$w" &
dosomething "$x" &
dosomething "$z" &
dosomething "$aa" &
dosomething "$bb" &
dosomething "$cc" &
dosomething "$dd" &
dosomething "$ee" &
dosomething "$ff" &
dosomething "$gg" &
dosomething "$hh" &
dosomething "$ii" &
dosomething "$jj" &
wait
done < somefile
이는 특정 행(옆에 있는 변수로 표시됨)을 처리하는 샘플 함수/애플리케이션 dosomething
일 뿐입니다 .something
본질적으로 이것은 잘 작동합니다. 배열을 사용하여 이 작업을 더 좋게 만들고/보기 좋게 만들려고 노력하고 있지만 배열을 사용하도록 형식을 지정하는 방법을 잘 모르겠습니다...
N개 작업에 대한 변수 이름을 생성합니다($1 등과 같은 일반적인 번호가 매겨진 변수에 문제가 발생할 수 있으므로 알파만 있고 숫자는 없음).
혼동을 방지하기 위해 위 스크립트의 각 읽기는 "한 줄"을 수행하므로 각 읽기 = 한 줄입니다. 이는 반복할 때마다 X의 한 행을 읽는다는 의미입니다. 각 반복이 끝나면 wait
모든 작업이 완료될 때까지 기다립니다.
예:
- 이것대답은 두 개의 파일에서 동시에 두 줄(한 줄에 한 줄)을 읽는다는 점을 제외하면 내가 하고 있는 것과 비슷한 작업을 수행합니다. 더 많은 기능이 있습니다.
추신: or 다른 것을 사용하면 더 잘할 수 있다는 것을 알고 있지만 parallel
가능 xargs
하다면 bash/POSIX를 사용하는 것이 더 좋습니다.
어떤 의견이라도 감사하겠습니다.
답변1
배열을 사용하지 않지만 대기 시점을 결정하기 위해 카운터를 유지합니다.
count=0
while read -r line; do
dosomething "$line" &
((++count % 35 == 0)) && wait
done < file
그런데 이 변수가 마음에 들지 않나요 y
?
코드에 큰 문제가 있습니다. 35줄을 모두 성공적으로 읽어야 합니다 dosomething
. 파일을 처리하는 동안 읽기를 시도했지만 EOF에 도달했다고 가정해 보겠습니다. a
0이 아닌 값이 반환되고 while 조건이 실패하며 및 처리 없이 루프가 중단됩니다.b
c
read
$a
$b
배열을 사용하는 것은 간단하지 않습니다.
mapfile -t lines < file
len=${#lines[@]}
i=0
while ((i < len)); do
for _ in {1..35}; do
dosomething "${lines[i]}" &
((i++))
((i == len)) && break
done
wait
done