カスタム要素から単語リストを作成するには?

カスタム要素から単語リストを作成するには?

カスタム要素からテキストファイルの単語リストを作成したいと思います。

element1:
word1
word2
word3

element2:
word4
word5

element3:
word6
word7

各要素が要素1、2、3の単語の組み合わせであることを望みます。たとえば、次のようになります。

word1word4word6
word1word5word6
word1word4word7
word1word5word7

そして、リストのすべての要素1、2、3のすべての単語の組み合わせを取得するまで続けます。シェルスクリプトまたはPythonスクリプトでこれを行うには?私はLinuxを使用しています。

答え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

purePythonslices を使用します。

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)

purebasharrays を使用します。

#!/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 xb1以外のサイズの配列を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テキストは2つの連続した改行を使用して段落に分割されますsplit\n\n2つに分かれた「段落」処理以上連続改行の場合.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のハッシュはランダムなので、1行に必要な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

関連情報