カスタム要素からテキストファイルの単語リストを作成したいと思います。
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
purePython
とslice
s を使用します。
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)
purebash
とarray
s を使用します。
#!/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
テキストは2つの連続した改行を使用して段落に分割されますsplit
。\n\n
2つに分かれた「段落」処理以上連続改行の場合.split(/ \n ** 2..* /, :skip-empty)
。
段落に適切に分割されると、各段落は個々の改行文字に再分割され、ハッシュに格納されている\n
キー/値構造が得られます。%h
最初の行はキー(index .[0]
)になり、残りの行は値(index .[1..*]
)になります。
最後に、Rakuには、X
LHSと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