実際には、テキストファイルから各単語の頻度を生成するのに役立つコードをオンラインで見つけましたが、誰かがこれを行う方法を正確に説明したいと思います。
特にsedコマンドです。私はbashに最初に触れ、すべての区切り文字()が何をしているのかを知る必要があるからですs/\(.*\)/\L\1/
。
コードは次のとおりです。
cat EnglishText.txt
sed 's/\.//g;s/\(.*\)/\L\1/;s/\ /\n/g' EnglishText.txt | sort | uniq -c
sedの後に正確に何が起こるのか知りたいです。 uniq -cとの並べ替えは理解していますが、マッチングなどで何が起こっているのか知りたいです。これは少し奇妙であることがわかりますが、もう一度これについて非常に不慣れに感じます。
同じ質問の文脈で
sed 's/\([0-9]*\).*/\1/'
それはどういう意味ですか?
ベストアンサー1
スクリプトsed
は3つの代替コマンドで構成されています。置換コマンドは、s/old/new/
テキスト内の正規表現に一致old
する項目を検索し、置換する形式を取りますnew
。g
コマンドの後にaがある場合、この置換は繰り返し実行されます(「グローバル」)。最初はピリオドを削除します。 2番目はテキストを小文字にします。 3番目は、各単語を1行に配置します。もっと詳しく:
s/\.//g
これは入力のピリオドと一致し、何も置き換えません。
s/\(.*\)/\L\1/
これは入力内のすべての項目と一致し、同じコンテンツの小文字バージョンに置き換えられます。
s/\ /\n/g
これはスペースを改行文字に置き換えます。これは、各単語を別々の行に配置する効果があります。
はい
ピリオドが削除され、すべての単語が小文字で別々の行に配置されます。
$ echo 'This test is this test.' | sed 's/\.//g;s/\(.*\)/\L\1/;s/\ /\n/g'
this
test
is
this
test
このフォームはソートと計算に適しています。
$ echo 'This test is this test.' | sed 's/\.//g;s/\(.*\)/\L\1/;s/\ /\n/g' | sort | uniq -c
1 is
2 test
2 this
改善する
書かれているように、sed
スクリプトは他の句読点文字(または?"!
タブなど)に対して何もしません。上記のコードを少し変更すると、すべての問題を処理できます。
$ echo 'This "test(?)" is this test!' | sed 's/[[:punct:]]//g; s/.*/\L&/; s/[[:space:]]/\n/g' | sort | uniq -c
1 is
2 test
2 this
これは、いくつかのマイナーな変更のみを除いて、元のコマンドと同じタイプの代替コマンドを使用します。
s/[[:punct:]]//g
すべての句読点を削除してください。s/.*/\L&/
すべての大文字を小文字に変換します。s/[[:space:]]/\n/g
すべてのスペースを改行に置き換えます。
付録
行が数字で始まる場合は、sed 's/\([0-9]*\).*/\1/'
その数字を保持し、その後のすべての項目を削除します。他のすべての行は削除されます。たとえば、
$ echo '123 tests' | sed 's/\([0-9]*\).*/\1/'
123
$ echo 'There are 123 tests' | sed 's/\([0-9]*\).*/\1/'