ファイルから単語をどのように解析しますか?


1

こんにちは、このようなファイルがあるとしましょう

<jack,
john.
................
,joe
..........Jen..
>Tom
Edwa4rd
4Tim
Richard

これを次のようなクリーンなリストに変換するにはどうすればよいですか

jack
John
joe
Jen
Tom
Tim
Richard

エドワードがリストにないことに注意してください

Linuxコマンドを使用していますか?おそらくgrepおよび/またはsed


とに興味がEdwaありrdますか?
イグナシオバスケス-アブラムス

Edward辞書なしで完全に破棄することは不可能だと思います。
デニス

それが不可能な場合、エドワードとティムを捨てましょう、なぜそれが不可能なのか本当に分かりませんが、(真ん中の数字なら単語ではない)または正規表現でそのようなことはできませんか?複数のコマンドを実行することもできますが、これが役立つ場合は1つである必要はありません
-user893730

3
「途中で数場合は、」:はい、「を区別することはできませんEdwa4rd」と例えば、「Lisa7annaいくつかの辞書にあらかじめすべての有効な名前を知らなくても」。そして、「Mary0anne」は1つの無効な名前(Maryanne)または2つの有効な名前(Mary、Anne)ですか?それが以前のコメント者が指摘した問題です。
ダニエルアンダーソン

回答:


2

egrep -o '[A-Za-z](.*[A-Za-z])?' < infile | egrep -o '[A-Za-z]+' > outfileあなたの例を試してみてください。

最初の部分は名前のようなもの(文字で始まり、文字で終わる必要がありますが、それらの間に何かが含まれる場合があります)を選択し、2番目のegrep部分はすべて文字である名前だけにフィルターをかけます。

これを見ると、これらの式が失敗し、正確なものと完全に一致しない入力を作成する方法に関するいくつかの道がすでにあります(まあ、これは書かれているとおりに一致しますが、あなたは曖昧さを残しました-方法処理する必要..Richard..<Tim?..がありますか?)、しかし、入力データに基づいてこれをまとめるのは簡単でした-シェルスクリプトは、多くの場合、すべての可能な入力に対して数学的な正確さは約100%未満ですが、入力ドメインを知って、式と処理しなければならない入力に対して十分に機能するコマンド。


.NetまたはJavaなどを使用すると、非常にうまく機能します。同様のことがsed、コマンドラインで実行できます。
ダースアンドロイド

1

正規表現^[^a-zA-Z]*([a-zA-Z]+)[^a-zA-Z]*$は機能するはずです。

  1. ^ 行頭に一致
  2. [^a-zA-Z]* ゼロ個以上の非文字の出現に一致します
  3. [a-zA-Z]+ 文字の1回以上の出現に一致します
  4. [^a-zA-Z]* ゼロ個以上の非文字の出現に一致します
  5. $ 行末に一致

したがって、行の先頭と後続の非文字を無視し、最初の文字と最後の文字の間に非文字がない場合にのみ一致します。

かっこは、キャプチャグループを示します。キャプチャグループは、抽出して印刷する部分です。私はもともとこれを書いて.NET用にテストしましたが、ここにsedコマンドがあります。どのようにsed機能するかを聞かないでください。

sed -rn 's/^[^a-zA-Z]*([a-zA-Z]+)[^a-zA-Z]*$/\1/p' inputfile

印刷する代わりに、出力ファイルに直接書き込むことができます。

sed -rn 's/^[^a-zA-Z]*([a-zA-Z]+)[^a-zA-Z]*$/\1/w outputfile' inputfile

これは、文字を含まない行を処理しないため、変更せずに出力に渡すことができます。
ダースアンドロイド

@DarthAndroidそれは彼の例で動作します... 3行目には文字が含まれていません。[a-zA-Z]+少なくとも1文字と一致する必要があります。空白行でも機能します。でテスト済みGNU sed 4.2.1
ボブ

1

grep -o '[[:alpha:]]\+'すべての「単語」を抽出するために使用します。

jack
john
joe
Jen
Tom
Edwa
rd
Tim
Richard

どれが名前で、どれが単なる文字のシーケンスであるかを判断するのはあなた次第です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.