입력 파일이 있는데,이름.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[@]}"
parallel
printf '%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[@]}"