web-dev-qa-db-ja.com

UNIXコマンドラインでファイルを単語で分割するにはどうすればよいですか?

単純なブール情報検索システムのテストを高速化しています。awk、grep、egrep、sed、または事物と類似のパイプを使用して、テキストファイルを単語に分割し、行ごとにWordを使用して他のファイルに保存します。私のファイルコートの例:

Hola mundo, hablo español y no sé si escribí bien la
pregunta, ojalá me puedan entender y ayudar
Adiós.

出力ファイルには以下が含まれている必要があります。

Hola
mundo
hablo
español
...

感謝!

22
jaundavid

Trの使用:

tr -s '[[:punct:][:space:]]' '\n' < file
49
Guru

最も簡単なツールはfmtです。

fmt -1 <your-file

指定された幅に合わせて改行するように設計されたfmtと、-1単語の直後に壊れます。見る man fmtドキュメント。インスピレーション http://everythingsysadmin.com/2012/09/unorthodoxunix.html

9
geekQ

sedの使用:

$ sed -e 's/[[:punct:]]*//g;s/[[:space:]]\+/\n/g' < inputfile

基本的に、これはすべての句読点を削除し、スペースを改行で置き換えます。これはまた、sedの味が\nを理解していることを前提としています。一部ではサポートしていません-その場合、代わりにリテラルの改行を使用できます(つまり、引用符の中に埋め込むことによって)。

3
FatalError

grep -oは、パターンに一致する一致行の部分のみを出力します

grep -o '[[:alpha:]]*' file
2
umi
cat input.txt | tr -d ",." | tr " \t" "\n" | grep -e "^$" -v

tr -d "、。" 「、」、「。」を削除します

tr "\ t" "\ n"はスペースとタブを改行に変更します

grep -e "^ $" -vは、空の行を削除します(2つ以上のスペースの場合)

1
kyticka

これまでの回答に基づいて、おそらくあなたが探しているのは、単語をスペース、コンマ、文末文字(つまり、英語では「。」「!」または「?」)で区切られた文字のシーケンスとして扱うことだと思います英数字と組み合わせて通常は見つけることができない文字(「<」や「;」ではなく'-#$% )。さて、「。」は文末文字ですが、$27.00は「単語」と見なす必要があるため、.はコンテキストに応じて異なる方法で処理する必要があります。同じことがおそらく「-」や他のいくつかの文字にも当てはまると思います。

したがって、これを変換するソリューションが必要です。

I have $27.00. We're 20% under-budget, right? This is #2 - mail me at "[email protected]".

これに:

I
have
$27.00
We're
20%
under-budget
right
This
is
#2
mail
me
at 
[email protected]

あれは正しいですか?

GNU awkを使用してこれを試して、RSを複数の文字に設定できるようにします。

$ cat file
I have $27.00. We're 20% under-budget, right? This is #2 - mail me at "[email protected]".

$ gawk -v RS="[[:space:]?!]+" '{gsub(/^[^[:alnum:]$#]+|[^[:alnum:]%]+$/,"")} $0!=""' file
I
have
$27.00
We're
20%
under-budget
right
This
is
#2
mail
me
at
[email protected]

他のいくつかのテストケースを考えて、これが常に期待どおりに機能するかどうかを確認してください。

1
Ed Morton

このawk行も機能する可能性がありますか?

awk 'BEGIN{FS="[[:punct:] ]*";OFS="\n"}{$1=$1}1'  inputfile
1
Imagination

Perl の使用:

Perl -pe 's/(?:\p{Punct}|\s+)+/\n/g' file

出力

Hola
mundo
hablo
español
y
no
sé
si
escribí
bien
la
pregunta
ojal�
me
puedan
entender
y
ayudar
Adiós
0
Gilles Quenot

Perl -ne 'print join( "\ n"、split)'

申し訳ありませんが@jsageryd

その1つのライナーは、最後のWordを次の最初のWordと結合するため、正しい答えを与えません。

これはより良いですが、srcの空白行ごとに空白行を生成します。パイプ経由| sed '/ ^ $/d'それを修正する

Perl -ne '{print join( "\ n"、split(/ [[:^ Word:]] + /))、 "\ n"; } '

0
Fred Gannett

非常に簡単なオプションは最初に、

sed 's,\(\w*\),\1\n,g' file

アポストロフィも句読点も処理しないことに注意してください

0
jpmuc

Perlの使用:

Perl -ne 'print join("\n", split)' < file

0
jsageryd