![シェル芸で、文章から特定の文字列が縦読みで存在するかどうかgrepする シェル芸で、文章から特定の文字列が縦読みで存在するかどうかgrepする](/images/4/4/8/1/8/4481856b9ca3e6982f8cdc021a2a245c2ee0712a-20170326004426000001.jpeg)
ふと、文章の中に縦読みで特定の文字列が仕込まれていないかどうか、シェル芸で確認できないかなと思ったのでやってみた。 至極当たり前の話として、grepは行に対して処理を行うので縦書きのものには利用できない。 で、じゃあどうすればいいのか。 縦書きに対して処理できないなら、横書きに変換してしまえばいい。
縦書きから横書きに変換するのは、結構前に表に対して同様の処理を行っていたので、それを応用してやれば良い。 ちょっと長くなるけど、awkでやった際のコマンドが以下。
awk -F '' '{for(i=1;i<=NF;i++){a[NR,i]=$i}}NF>p{p=NF}END{for(j=1;j<=p;j++){str=a[1,j];for(i=2;i<=NR;i++){str=str""a[i,j];}print str}}' file.path | cat -n | grep -i String
[root@BS-PUB-CENT7-01 ~]# cat test1.txt
長い夢から覚めた気分だ・・・俺は気がつくとここにいた
門の前には2つの人影がある・・・1人は若い男だ
はっとした。見間違いだと思った・・・あの・・・もう1人の人物は・・・
俺は信じがたい光景を目の当たりにして少々混乱した
のうのうと生きてきた自分を初めて呪った・・・
嫁だ・・・これは・・・嫁の浮気現場だったのだ・・・俺は神を憎み、絶望した・・・
[root@BS-PUB-CENT7-01 ~]# cat test1.txt | awk -F '' '{for(i=1;i<=NF;i++){a[NR,i]=$i}}NF>p{p=NF}END{for(j=1;j<=p;j++){str=a[1,j];for(i=2;i<=NR;i++){str=str""a[i,j];}print str}}'| cat -n - | grep -i -e 長門
1 長門は俺の嫁
無事、縦書きの箇所が取得できた。 …やっといてなんだけど、こんなん何かの役に立つのだろうか?と思わなくもない。 Fワードとか書いた単語リストを作っておいて、grepでそのファイルを読み込ませることで、文章に縦書きが仕込まれてるかどうかを確認するくらいかなぁ…。
~追記~
@ebanさんがもっと短く書いてた。 無理してawk1個でやるのではなく、seqで対象となる文字位置(列)をxargs経由でawkに渡している。 確かに、言われてみれば…全然思いつかなかった。
seq 100 | xargs -I@ awk '{a=a substr($0,@,1)}END{print a}' test1.txt | grep -n 長門
[root@BS-PUB-CENT7-01 ~]# seq 100 | xargs -I@ awk '{a=a substr($0,@,1)}END{print a}' test1.txt | grep -n 長門
1:長門は俺の嫁
文字の個数が決め打ちで100になっているので、とりあえず各行の最大数を使って処理させるようにしたのが以下。
seq $(awk '{n=length($0);if(m<n) m=n}END{print m}' test1.txt) | xargs -I@ awk '{a=a substr($0,@,1)}END{print a}' test1.txt | grep -n 長門