쉘 배열을 사용하여 N 줄의 파일을 병렬로 읽습니다.

쉘 배열을 사용하여 N 줄의 파일을 병렬로 읽습니다.

따라서 나는 모든 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에 도달했다고 가정해 보겠습니다. a0이 아닌 값이 반환되고 while 조건이 실패하며 및 처리 없이 루프가 중단됩니다.bcread$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

관련 정보