私はマークダウンで学生のためのクイズを書いています。テストの1つは次のとおりです。
% QUESTION
Who played drums for The Beatles?
(X) Ringo
( ) John
( ) Paul
( ) George
% QUESTION
What is the first line of MOBY DICK?
(X) Call me Ishmael.
( ) foo
( ) bar
( ) spam
( ) eggs
私はこのすべての選択肢オプションをランダムに選択したいと思います。だからシェルスクリプトが必要だと思います。
- (X)または()で始まる連続した行ブロックをすべて見つけます。
- これらの各行ブロックをスクランブルします。
可能ですか?私はこれを知り、shuf
テキストsort -R
行をランダムに選択しますが、これらのオプションブロックを分離する方法がわかりません。
ベストアンサー1
AWKを使用:
BEGIN {
srand()
answers[1] = ""
delete answers[1]
}
function outputanswers(answers, len, i) {
len = length(answers)
while (length(answers) > 0) {
i = int(rand() * len + 1)
if (answers[i]) {
print answers[i]
}
delete answers[i]
}
}
/^$/ {
outputanswers(answers)
print
}
/^[^(]/
/^\(/ {
answers[length(answers) + 1] = $0
}
END { outputanswers(answers) }
答えを配列に蓄積しanswers
、必要に応じてその内容をランダムな順序で出力するように動作します。行が開かれているかっこで始まると、答えと見なされます(これはあなたの仕様を効果的に単純化することを願っています)。