まひろ量子のハックログ

プログラミングや機械学習などの知識を記録・共有します

1文字ごとに改行するコマンド (日本語もOK)

あいうabc

▲これを、こうしたい▼

あ
い
う
a
b
c

自然言語処理をやっていると、テキストファイルの中に含まれている「文字」を1つ1つ列挙したくなることが時折ある。Linuxコマンドを使ってサクッとできないものかと思い、「1文字ごと 改行」などのキーワードで調べてみた。しかし、見つかる記事はどれも、バイト数を指定して改行するもので、半角英数字にのみにしか対応していないものばかりだった。もちろん、2 バイトごとに改行すれば2バイト文字である日本語も改行できる。しかし、それでは日本語と英字が混ざったテキストにはうまく適用できないという問題がある。

半角全角に関係なく1文字ごとに改行する方法

結論から言うと、これがベストだ、

nkf -f1-0

nkfコマンドの"-f"オプションを利用する。指定したバイト数で改行してくれるオプションだが、2バイト文字もうまく処理してくれる。上述のコマンドは1バイト(ただし2バイト文字は2バイトで)改行するという意味だ。

-f1-0 の末尾の -0 はマージンと呼ばれるものだ。

通常、英語の文は単語途中で改行しないという決まりがある。nkfは、この決まりを守って改行してくれる。うまり、指定したバイト数で厳密には改行されず、何文字か余分にカウントされる。この余分な文字を「何文字まで許容するか」が、マージンの意味するところである。ちなみに、デフォルトではマージンは10だ。

nkf -f30 hamlet.txt


The nights are wholesome; then
no planets strike, No fairy takes,
nor witch hath power to charm,
So hallow'd and so gracious is
the time.

このマージンを"0"と指定すれば、強制的に指定バイト数で改行させることができる。つまり、1文字で強制的に改行したい場合は

nkf -f1-0

となる。しかも嬉しいことに、2バイト文字の場合はうまく2バイト分で改行してくれる。

サンプルを使って試してみよう。

cat input
ABCDEあいうえXYZ
今日も1日かんばるzoi

空行もあるよ!
nkf -f1-0 input
A
B
C
D
E
あ
い
う
え
X
Y
Z

今
日
も
1
日
か
ん
ば
る
z
o
i


空
行
も
あ
る
よ
!

うまく1文字で改行されている。

空行を削除したいときはこうだ。

nkf -f1-0 input | grep -v "^$"
A
B
C
D
E
あ
い
う
え
X
Y
Z
今
日
も
1
日
か
ん
ば
る
z
o
i
空
行
も
あ
る
よ
!

ユニーク(被りが無いよう)にするときはこうだ。

nkf -f1-0 input | grep -v "^$" | sort -u
!
1
A
B
C
D
E
X
Y
Z
i
o
z
あ
い
う
え
か
ば
も
よ
る
ん
空
行
今
日

nkfがlinuxにインストールされていない場合は、以下のようにしてインストールすることができる。(例はUbuntuの場合)

sudo apt-get install nkf

以上。

Kozuko Mahiro's Hacklog ―― Copyright © 2018 Mahiro Kazuko