シェル芸で文字列のNグラムを出力する
Pocket

文字列のNグラムをシェル芸で出す場合、色々とやり方があるようなので、念の為忘れないように残しておく。
前に「響け!ユーフォニアム」でNグラムを生成していた場合は、以下のようにsedでループさせる方法で行っていた。

echo 響け!ユーフォニアム|sed ':a;p;s/\(.\)\(.*\)//;ba' | head
blacknon@BS-PUB-UBUNTU-01:~$ echo 響け!ユーフォニアム|sed ':a;p;s/\(.\)\(.*\)//;ba' | head
響け!ユーフォニアム
け!ユーフォニアム響
!ユーフォニアム響け
ユーフォニアム響け!
ーフォニアム響け!ユ
フォニアム響け!ユー
ォニアム響け!ユーフ
ニアム響け!ユーフォ
アム響け!ユーフォニ
ム響け!ユーフォニア
Sponsored Links

あと最近見かけた方法としては、ebanさんのやってたnkf -fNを利用したやり方がとてもシンプル。
nkfでは、-fNでNバイトで改行を無視してくれるようで、それを利用することでかなりシンプルに書けるようだ。流石だ…。

yes 高須クリニック | nkf -f16 | head -7 | sed 's/.$//g'
blacknon@BS-PUB-UBUNTU-01:~$ yes 高須クリニック | nkf -f16 | head -7 | sed 's/.$//g'
高須クリニック
須クリニック高
クリニック高須
リニック高須ク
ニック高須クリ
ック高須クリニ
ク高須クリニッ

 

上を参考に、grepで文字数を指定して処理する場合。
バイト数とかは気にしなくてもいいけど、ちょっと長くなる。

yes 高須クリニック | head -8 | tr -d \n | grep -Eo .{8} | sed 's/.$//g'
blacknon@BS-PUB-UBUNTU-01:~$ yes 高須クリニック | head -8 | tr -d \n | grep -Eo .{8} | sed 's/.$//g'
高須クリニック
須クリニック高
クリニック高須
リニック高須ク
ニック高須クリ
ック高須クリニ
ク高須クリニッ

 

Pocket

Written by blacknon

インフラエンジニア(…のつもり)。 仕事で使うならクライアントはWindowsよりはUNIXの方が好き。 大体いつも眠い。

Leave a Comment

メールアドレスが公開されることはありません。

*