사용자 정의 요소에서 단어 목록을 만드는 방법은 무엇입니까?

사용자 정의 요소에서 단어 목록을 만드는 방법은 무엇입니까?

사용자 정의 요소에서 텍스트 파일의 단어 목록을 만들고 싶습니다.

element1:
word1
word2
word3

element2:
word4
word5

element3:
word6
word7

각 요소가 요소 1, 2, 3의 단어 조합이기를 원합니다. 예를 들면 다음과 같습니다.

word1word4word6
word1word5word6
word1word4word7
word1word5word7

그리고 목록의 모든 요소 1, 2, 3에 대한 모든 단어 조합을 얻을 때까지 계속합니다. 쉘 스크립트 또는 Python 스크립트에서 이를 수행하는 방법은 무엇입니까? 저는 리눅스를 사용하고 있습니다.

답변1

이것은 순전히 프로그래밍 질문처럼 들리며 Linux나 Unix와는 아무 관련이 없습니다. 그러나 테스트되지 않은 코드는 다음과 같습니다.

#!/bin/bash
element1=( "word1" "word2" "word3" )
element2=( "word4" "word5" )
element3=( "word6" "word7" )
for i in "${element1[@]}"; do
  for j in "${element2[@]}"; do
    for k in "${element3[@]}"; do
      printf "%s%s%s\n" "$i" "$j" "$k"
    done
  done
done

답변2

pure Pythonslices를 사용하십시오.

element1 = ( 'word1', 'word2', 'word3' )
element2 = ( 'word4', 'word5' )
element3 = ( 'word6', 'word7' )

for el1 in element1:
    for el2 in element2:
        for el3 in element3:
            print(el1 + el2 + el3)

pure basharrays를 사용하십시오.

#!/bin/bash

element1=( 'word1' 'word2' 'word3' )
element2=( 'word4' 'word5' )
element3=( 'word6' 'word7' )

for el1 in "${element1[@]}"; do
    for el2 in "${element2[@]}"; do
        for el3 in "${element3[@]}"; do
            echo "$el1$el2$el3"
        done
    done
done

POSIX쉘 로서 쉘의 것을 사용하십시오.분사string:

#!/bin/sh

element1="word1 word2 word3"
element2="word4 word5"
element3="word6 word7"
for el1 in $element1; do
    for el2 in $element2; do
        for el3 in $element3; do
            echo "$el1$el2$el3"
        done
    done
done

산출

word1word4word6
word1word4word7
word1word5word6
word1word5word7
word2word4word6
word2word4word7
word2word5word6
word2word5word7
word3word4word6
word3word4word7
word3word5word6
word3word5word7

답변3

존재하다 zsh:

element1=(
  word1
  word2
  word3
)
element2=(word4 word5)
element3=(word6 word7)

combinations=( $^element1$^element2$^element3 )

이것을 사용하여 열에 인쇄할 수 있습니다.

print -rC1 -- $combinations

또는

printf %s $^combinations$'\n'

$^element1$^element2$^element3$element1$element2$element3옵션을 미리 설정해 놓으면 ( ) rcexpandparam간단해집니다 .set -o rcexpandparam

fish기본적으로 같은 스타일로 배열을 확장하는 것과 같습니다 rc.

set element1 word1 word2 word3
set element2 wort4 word5
set element3 word6 word7
set combinations $element1$element2$element3
echo -ns -- $combinations\n

¹ 에서는 rc배열이 정확하게 그렇게 확장되지 않습니다. a=(a b); echo x$a출력 xa xb하지만 1이 아닌 다른 크기의 배열을 echo $a$a출력하는 aa bb대신 aa ab ba bb오류가 발생하므로 여기서는 사용할 수 없습니다.

답변4

사용행복하다(이전 Perl_6)

~$ raku -e 'my %h = slurp.split("\n\n", :skip-empty)    \
                    .map( *.split("\n", :skip-empty))   \
                    .map: {.[0] => .[1..*]};            \
            .say for [X] %h.map: *.value;'   file

slurp이 솔루션은 줄 바꿈 등을 한꺼번에 포함하는 파일이기 때문에 메모리에 맞는 파일에 유용합니다 . ing 을 사용하면 slurp텍스트가 두 개의 연속 줄 바꿈을 사용하여 단락으로 나누어집니다 split. \n\n두 개로 구분된 "단락" 처리이상연속적인 개행의 경우 .split(/ \n ** 2..* /, :skip-empty).

단락으로 적절하게 분할되면 각 단락은 개별 개행 문자로 다시 분할되어 해시 \n에 저장되는 키/값 구조를 얻습니다 . %h첫 번째 행은 키(index .[0])가 되고 나머지 행은 값(index .[1..*])이 됩니다.

마지막으로 Raku에는 XLHS 및 RHS 값 목록이 제공되면 요소 조합을 반환하는 교차곱 중위 연산자가 있습니다. 많은 (모두?) 중위 연산자를 다음으로 변환할 수 있습니다.축소 메타 연산자대괄호로 묶고 목록 시작 부분에 넣으세요. 따라서 결합된 교차곱이 생성되고 출력되는 [X] %h.map: *.value;키로 구성된 해시 목록을 만듭니다 .values

입력 예:

element1:
word1
word2
word3

element2:
word4
word5

element3:
word6
word7

예제 출력:

(word1 word6 word4)
(word1 word6 word5)
(word1 word7 word4)
(word1 word7 word5)
(word2 word6 word4)
(word2 word6 word5)
(word2 word7 word4)
(word2 word7 word5)
(word3 word6 word4)
(word3 word6 word5)
(word3 word7 word4)
(word3 word7 word5)

Raku의 해시는 무작위이므로 한 줄에 필요한 3개의 "단어"를 얻을 수 있지만 단어의 순서는 무작위입니다. 또한 (적어도 다른 답변과 달리) 이 Raku 답변은 반복되는 "단어"를 허용합니다.

참고: OP가 원하는 정확한 출력을 생성하려면 마지막 줄을 join공백 없이 out으로 변경하십시오 put.

.join.put for [X] %h.map: *.value;

또는 더 간단합니다( ~물결표 연결 사용).

.put for [X~] %h.map: *.value;

https://docs.raku.org/언어/operators#Reduction_metaoperators
https://docs.raku.org/routine/X
https://raku.org

관련 정보