テキスト文書で本と詩を検索しようとしています。

テキスト文書で本と詩を検索しようとしています。

私のUbuntuコンピュータには、いくつかの聖書の本と聖句を参照するいくつかの文書があります。本のタイトル、章番号、1つ以上のフレーズを表示するリストを作成したいです。文書の一般的な項目はMatt 12:1またはですJohn 9: 4-9

可能であれば、リストにはMatt 12:1ページ番号と文書内のページが見つかった回数を含める必要があります。すべての単語のリストを含むtxtファイルを生成するスクリプトがあります。一度も使ったことがなかったので、grep完全に感覚を失いました。

単語リストに対して私がしたことは次のとおりです。

cat exported.txt | grep -o -E '\w+' | tr '[A-Z]' '[a-z]' | sort | uniq -c >preconcordance.txt

いくつかの例を含むスニペット:

聖書は彼らがエルサレム人であり(ヨハネ6:43-47、イザヤ54:11、13)、これらの息子が神に仕えたと言っています(マラキ3:17-18)。これら二つの都市は、永遠の火で死に遭う人々に起こる事例です。ペテロは次のように書いています。 ペテロ 2:6。ムジャギンは、すべての幽霊の中で最も邪悪な者が閉じ込められた場所です(ペテロ2:4、ユダ1:6、ヨハネの黙示録9:1)。この監禁の場所の詳細については、ルカ8:31を参照して、これらの幽霊を無垢に送るキリストの力に注意してください。

編集する

私の質問を変えて言えば:括弧内のテキストと数字を見つけることは可能ですか?私の本のタイトルの章と参照の詩の両方(2Pet 1:2-3)。この時点で完全に私のリーグから抜け出した。

ベストアンサー1

使用幸せ(以前のPerl_6)

raku -e 'my @a = slurp.split(". "); my @b = @a.match(:global, / "(" ~ ")" .+? / ).join;  \
         @b.=split(/ \,\s* || <[()]> /, :skip-empty); .say for @b.map(*.tc).Bag.sort(-*.value);' 

入力例(OPの最初の参照はコピーされ、小文字です):

The Scriptures reveal it's the sons of Jerusalem (John 6:43-47, Isa 54:11, 13), (john 6:43-47), and it's these sons who serve God (Mal 3:17-18). and These two cities are examples of what happens to those who suffer death by eternal fire. Peter wrote: 2Pet 2:6 .. The ABYSS is where the most wicked of all demons are imprisoned (2Pet 2:4, Jude 1:6, Rev 9:1). For a further explanation of this place of restraint, see Luke 8:31, and note that Christ had the power to send these demons to the ABYSS.

出力例:

John 6:43-47 => 2
Jude 1:6 => 1
Rev 9:1 => 1
Isa 54:11 => 1
Mal 3:17-18 => 1
13 => 1
2Pet 2:4 => 1

RakuはPerlプログラミング言語スイートに属し、ここでは良い選択です。特に、ギリシャ語やギリシャ語などのUnicodeテキストで作業したい場合は、そうです。ヘブライ人文字(RakuはデフォルトでUnicodeを処理します)。

つまり、ファイルは ""ピリオドスペースにslurped(一度にすべてを読み取る)と(破壊的に)テキストを文章に分割することです。これらの要素は配列に保存されます。 2番目のステートメントでは、配列は正規表現に対してテストされます。これはRakuが括弧付きのテキストを見つける方法です(正規表現も機能しますが、次の注意事項を参照してください)。split. @a@amatch"(" ~ ")" .+?"(" .+? ")"入れ子構造)。これらの一致はjoin編集され(デフォルトで空の要素が削除され)、配列に割り当てられます@b

3番目の文では、角かっこ内のテキストは再び(破壊的に)ですsplit。今回は、カンマの後にオプションのスペースが続くか、\,\s*...タグを使用して作成または構成された<[()]>カスタム文字クラスです。この例では、空白要素を削除します。この結果は配列に再割り当てされます(例:構文砂糖)。<[]>()split(… , :skip-empty).=@b@b.=split(…)@b = @b.split(…)

最後に、4番目のステートメントでは、要素はタイトルケースのmap(*.tc)-ged@bに変換されますBag(参照:ここ)、(値の減少)でsort編集されます-*.value。出力は、.say for以下を使用して1行ずつ生成されます。

キーと値を交換し、出力列を切り替え(およびソート順)するのは非常に簡単です。端を変更して.say出力から矢印を削除し、.putタブスペースで区切られた2つの列を残します。=>\t

https://raku.org

おすすめ記事