LLまつりに行ってきた(シェル芸復習その1[1,2問目]の巻)

お題の通りでして、すみだ産業会館で開催された、LLまつりに行ってきました。
今回の本命はコチラ
「第6回チャンピオンシップシェル芸ランナー勉強会 in LLまつり」です。

今回は残念ながら7問中2問しか解けなかったので、復習がてら、時間無制限で再度問題に挑戦してみます。
ちなみに環境はお名前.com上のCentOS6.4(x86_64)です。この記事はその1問目に対する解答。

1問目:

https://twitter.com/usptomo/status/371089673688338432
次の文字列について、濁点の文字、半濁点の文字、その他の文字(記号含む)の数を数えてください
「どんどこどん、ぱらぱっぱ、ぴろぴろぴー、すっとこどっこい。」

まずここは、模範解答に習って縦書に書き換えます。(ちなみにこの「横に長い文字列は縦書にすると見やすい」というのは個人的にかなり頷けたので、今後積極的に使っていこうと思いました)

$ echo "どんどこどん、ぱらぱっぱ、ぴろろぴー、すっとこどっこい。" > quiz1.txt
$ sed 's/./\n&/g' quiz1.txt

ど
ん
ど
こ
ど
ん
、
ぱ
ら
ぱ
っ
ぱ
、
ぴ
ろ
ぴ
ろ
ぴ
ー
、
す
っ
と
こ
ど
っ
こ
い
。

あとはここから濁点、半濁点部分の行数をかうんとすれば、該当部の件数は取れそうです。残りの部分は全行数から濁点、半濁点の行数を引いてやることで取れます。汚いですが

$ a=`sed 's/./\n&/g' quiz1.txt |grep -c [がぎぐげござじずぜぞだぢづでどば びぶべぼぱぴぷぺぽ]` ;b=`sed 's/./\n&/g' quiz1.txt |wc -l` ; echo "濁点、半濁点 の数:${a}" ;echo "その他の文字の数:`expr ${b} - ${a}`"
濁点、半濁点の数:10
その他の文字の数:20

まぁ、取れてますよね。エレガントさの欠片もない力技ですが。
ここからやりたいのは

grep -c [がぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽ]

をもう少しコンパクトに纏められないかというところ。文字コードgrep掛けられたらもうちょっと何とかならんかなぁ。
小一時間悩んだのですが、結局模範解答が使用している「カタカナに変換(nkf -h2)→半角に変換(nkf -Z4)」以外の手を思いつけませんでした。
後は一行のバイト数が2ならば濁点、半濁点付き、1ならばその他ということで、while ...

LANG=ja_JP.SJIS”
one_byte=0
two_byte=0
tmp_file=./`date +'%Y%m%d%H%M%S'`_$$
sed 's/./\n&/g' quiz1.txt |nkf -h2 |nkf -Z4 > ./${tmp_file}
while read line
do
  if [ `echo -n ${line} |wc -c` -eq 1 ] ;then
    one_byte=`expr $one_byte + 1`
  elif [ `echo -n ${line} |wc -c` -eq 2 ] ;then
    two_byte=`expr $two_byte + 1`
  else
    echo "想定外の値が出てしまった!"
    echo `echo -n ${line} |wc -c`
  fi
  echo "濁点、半濁点の数:${one_byte}"
  echo "その他の文字の数:${two_byte}"  
done < ${tmp_file}

が、手元の環境ではなぜかうまくいかない。全文字が8byteと認識されてしまうっぽいんだが、なぜだろう……。
仕方ないので第一問の解答は前述の力技でよしとすることにします。

続いて
2問目:
(おっとtwitter上では発言が無い。詳細はスライドの13枚目を見てください)

2つのファイルを横にくっつけてください

これは速攻で解けました。「ズルい」との声もありましたが、知識は力、知らないほうが悪いのよ。ということで、pasteコマンドという、知ってはいたけど業務で使ったことは一切ないコマンドを、偶々知っていたおかげで模範解答より入力文字数の少ない解答を出すことができました。

$ paste file[AB] |sed "s/[ \t]//g"
犬もおだてりゃ織田信長
論より暴力
年寄りのトライアスロン
テキサスクローバーホールド

これパイプの後はスライドにある通りtr使った方が、より短かくて良かったですね。

続きはまた後日。