Gnu 병렬을 사용하여 배열 요소 반복

Gnu 병렬을 사용하여 배열 요소 반복

입력 파일이 있는데,이름.txt, 한 줄에 1단어:

apple  
abble  
aplle 

내 bash 스크립트를 통해 다음과 같은 출력을 얻으려고 합니다.

apple and apple  
apple and abble  
apple and aplle  
abble and apple  
abble and abble  
abble and aplle  
aplle and apple  
aplle and abble  
aplle and aplle

이것은 내 bash 스크립트입니다.

#!/usr/bin bash
readarray -t seqcol < names.txt

joiner () {
           val1=$1
           val2=$2
           echo "$val1 and $val2"
}

export -f joiner

parallel -j 20 '
    line=($(echo {}))
    for word in "${line[@]}"; do
            joiner "${line}" "${word}"
    done
' ::: "${seqcol[@]}"

하지만 배열의 동일한 요소를 비교하여 다음 3줄만 출력합니다.

apple and apple  
abble and abble  
aplle and aplle

루프를 사용하는 스크립트가 있지만 while read line너무 느립니다(실제 데이터 파일은 약 200,000줄입니다). 그래서 배열 요소를 사용하면서 gnu parallel동시에 프로세스 속도를 높이고 싶습니다. 명령에서 배열 요소에
액세스하는 다양한 방법을 시도했지만 (주로 이 루프를 수정하거나 via 에 배열을 공급하여 ) 오류가 발생하거나 빈 줄이 출력됩니다.parallel ' 'for word in "${line[@]}"parallelprintf '%s\n' "${seqcol[@]}"

도움을 주시면 감사하겠습니다!

답변1

parallel올바른 출력 순서가 반드시 유지되는 것은 아닙니다.

어쨌든 성능에 관심이 있다면 bash텍스트 파일을 사용하지 마십시오. 대신 awk.또는 .와 같은 프로그래밍 언어 와 같은 특수 도구를 사용하십시오 python.

awk '
  { words[NR]=$0 }
  END {
    for (x in words){
      for (y in words) { printf "%s and %s\n",words[x],words[y] }
    }
  }' file

답변2

GNU Parallel은 모든 입력 소스 조합을 생성할 수 있습니다.

귀하의 경우에는 두 번만 사용하십시오 names.txt.

parallel -k echo {1} and {2} :::: names.txt names.txt

또는 (배열이 있는 경우):

readarray -t seqcol < names.txt
parallel -kj 20 echo {1} and {2} ::: "${seqcol[@]}" ::: "${seqcol[@]}"

관련 정보