awk

どうもこんばんは。 @nullpopopo です。またおっさんになってしまいました。以下の要件でLinuxのローカルユーザーを作成したくなったので、シェルスクリプト一撃でできるようにしてみました。

  1. OSインストール直後の真っさらな状態(root以外にログインできるユーザーはいない)
  2. UID GIDともに1000番から連番で作成。ただし、GIDは1000番固定。
  3. グループ名は「webmaster」
  4. パスワードはランダムな8文字で、 /root 直下にパスワードのメモを残しておく(もちろん後で消す)

…続きを読む

皆様おはようございます。以前、天気予報をスクレイピング しましたが、htmlのパースはソースが書き換えられると非常に厄介なのでどうしたものかと思っていたところ、livedoorがWeather Hacks(気象データ配信サービス) を提供しているので、こちらを利用してお天気Hackすることにしました。

…続きを読む

あるシステムの入力項目から入力されたテキストデータから、カタカナを強制的にアルファベット(ローマ字)へ変換したいという要件が出てきました。さすがにワンライナーでやるにはキツいので、sedの置換ファイルを作ってやるのが楽ですね。

s/キャ/kya/g
s/キュ/kyu/g
s/キョ/kyo/g
s/ギャ/gya/g
s/ギュ/gyu/g
s/ギョ/gyo/g
s/シャ/sha/g
s/シュ/shu/g
s/ショ/sho/g
s/ジャ/ja/g
s/ジュ/ju/g
s/ジョ/jo/g
s/チャ/cha/g
s/チュ/chu/g
s/チョ/cho/g
s/ヂャ/ja/g
s/ヂュ/ju/g
s/ヂョ/jo/g
s/ニャ/nya/g
s/ニュ/nyu/g
s/ニョ/nyo/g
s/ヒャ/hya/g
s/ヒュ/hyu/g
s/ヒョ/hyo/g
s/ビャ/bya/g
s/ビュ/byu/g
s/ビョ/byo/g
s/ピャ/pya/g
s/ピュ/pyu/g
s/ピョ/pyo/g
s/ミャ/mya/g
s/ミュ/myu/g
s/ミョ/myo/g
s/リャ/rya/g
s/リュ/ryu/g
s/リョ/ryo/g
s/ファ/fa/g
s/フィ/fi/g
s/フェ/fe/g
s/フォ/fo/g
s/ティ/thi/g
s/ディ/dhi/g
s/ヴァ/va/g
s/ヴィ/vi/g
s/ヴ/vu/g
s/ヴェ/ve/g
s/ヴォ/vo/g
s/ア/a/g
s/イ/i/g
s/ウ/u/g
s/エ/e/g
s/オ/o/g
s/カ/ka/g
s/ガ/ga/g
s/キ/ki/g
s/ギ/gi/g
s/ク/ku/g
s/グ/gu/g
s/ケ/ke/g
s/ゲ/ge/g
s/コ/ko/g
s/ゴ/go/g
s/サ/sa/g
s/ザ/za/g
s/シ/shi/g
s/ジ/ji/g
s/ス/su/g
s/ズ/zu/g
s/セ/se/g
s/ゼ/ze/g
s/ソ/so/g
s/ゾ/zo/g
s/タ/ta/g
s/ダ/da/g
s/チ/chi/g
s/ヂ/ji/g
s/ツ/tsu/g
s/ヅ/zu/g
s/テ/te/g
s/デ/de/g
s/ト/to/g
s/ド/do/g
s/ナ/na/g
s/ニ/ni/g
s/ヌ/nu/g
s/ネ/ne/g
s/ノ/no/g
s/ハ/ha/g
s/バ/ba/g
s/パ/pa/g
s/ヒ/hi/g
s/ビ/bi/g
s/ピ/pi/g
s/フ/fu/g
s/ブ/bu/g
s/プ/pu/g
s/ヘ/he/g
s/ベ/be/g
s/ペ/pe/g
s/ホ/ho/g
s/ボ/bo/g
s/ポ/po/g
s/マ/ma/g
s/ミ/mi/g
s/ム/mu/g
s/メ/me/g
s/モ/mo/g
s/ヤ/ya/g
s/ユ/yu/g
s/ヨ/yo/g
s/ラ/ra/g
s/リ/ri/g
s/ル/ru/g
s/レ/re/g
s/ロ/ro/g
s/ワ/wa/g
s/ヲ/wo/g
s/ン/n/g
s/ー/-/g

例えば大岡山(オオオカヤマ)をカタカナからローマ字に変換するにはこうします。

$ echo "オオオカヤマ" | sed -f katakana2alpha.sed
oookayama

先頭文字のみを大文字にするには、awkのワンライナーを使うと便利です。今回のワンライナーは py4s-tnk さんの一行パk・・・参考にさせていただきました。

$ echo "オオオカヤマ" | sed -f katakana2alpha.sed | awk '{print toupper(substr($1,1,1))substr($1,2)}'
Oookayama

上に貼り付けたコードをご覧いただけるとおわかりいただけるかと思いますが、2文字で発音する文字をファイルの最初に持ってきています。こうすることで、「貴社の記者は汽車で帰社した(キシャノキシャハキシャデキシャシタ)」をうまく変換することができます。

$ echo "キシャノキシャハキシャデキシャシタ" | sed -f katakana2alpha.sed 
kishanokishahakishadekishashita

もしこの工夫がなければ・・・

$ echo "キシャノキシャハキシャデキシャシタ" | sed -f katakana2alpha.sed 
kishiャnokishiャhakishiャdekishiャshita

このように、1文字目でマッチさせてしまうため、拗音があると無視されてしまうのです。拗音だけの変換テーブルを作ってやればいいじゃんという声もあるかも知れませんが、そもそも拗音だけ発音するという機会はないので作っていません。

どうしてもファイルを作りたくないという方はワンライナーでどうぞ。

$ echo "キシャノキシャハキシャデキシャシタ" | sed -e "s/キャ/kya/g;s/キュ/kyu/g;s/キョ/kyo/g;s/ギャ/gya/g;s/ギュ/gyu/g;s/ギョ/gyo/g;s/シャ/sha/g;s/シュ/shu/g;s/ショ/sho/g;s/ジャ/ja/g;s/ジュ/ju/g;s/ジョ/jo/g;s/チャ/cha/g;s/チュ/chu/g;s/チョ/cho/g;s/ヂャ/ja/g;s/ヂュ/ju/g;s/ヂョ/jo/g;s/ニャ/nya/g;s/ニュ/nyu/g;s/ニョ/nyo/g;s/ヒャ/hya/g;s/ヒュ/hyu/g;s/ヒョ/hyo/g;s/ビャ/bya/g;s/ビュ/byu/g;s/ビョ/byo/g;s/ピャ/pya/g;s/ピュ/pyu/g;s/ピョ/pyo/g;s/ミャ/mya/g;s/ミュ/myu/g;s/ミョ/myo/g;s/リャ/rya/g;s/リュ/ryu/g;s/リョ/ryo/g;s/ファ/fa/g;s/フィ/fi/g;s/フェ/fe/g;s/フォ/fo/g;s/ティ/thi/g;s/ディ/dhi/g;s/ヴァ/va/g;s/ヴィ/vi/g;s/ヴ/vu/g;s/ヴェ/ve/g;s/ヴォ/vo/g;s/ア/a/g;s/イ/i/g;s/ウ/u/g;s/エ/e/g;s/オ/o/g;s/カ/ka/g;s/ガ/ga/g;s/キ/ki/g;s/ギ/gi/g;s/ク/ku/g;s/グ/gu/g;s/ケ/ke/g;s/ゲ/ge/g;s/コ/ko/g;s/ゴ/go/g;s/サ/sa/g;s/ザ/za/g;s/シ/shi/g;s/ジ/ji/g;s/ス/su/g;s/ズ/zu/g;s/セ/se/g;s/ゼ/ze/g;s/ソ/so/g;s/ゾ/zo/g;s/タ/ta/g;s/ダ/da/g;s/チ/chi/g;s/ヂ/ji/g;s/ツ/tsu/g;s/ヅ/zu/g;s/テ/te/g;s/デ/de/g;s/ト/to/g;s/ド/do/g;s/ナ/na/g;s/ニ/ni/g;s/ヌ/nu/g;s/ネ/ne/g;s/ノ/no/g;s/ハ/ha/g;s/バ/ba/g;s/パ/pa/g;s/ヒ/hi/g;s/ビ/bi/g;s/ピ/pi/g;s/フ/fu/g;s/ブ/bu/g;s/プ/pu/g;s/ヘ/he/g;s/ベ/be/g;s/ペ/pe/g;s/ホ/ho/g;s/ボ/bo/g;s/ポ/po/g;s/マ/ma/g;s/ミ/mi/g;s/ ム/mu/g;s/メ/me/g;s/モ/mo/g;s/ヤ/ya/g;s/ユ/yu/g;s/ヨ/yo/g;s/ラ/ra/g;s/リ/ri/g;s/ル/ru/g;s/レ/re/g;s/ロ/ro/g;s/ワ/wa/g;s/ヲ/wo/g;s/ン/n/g;s/ー/-/g"

以上、sed awkの小ネタでございました。

1件のコメント

久々にシェル芸ブログです。2chまとめブログでこんなのを見つけたので、シェル芸で解いてみました。

面接官 「1~250までの数字がある。1つだけ抜けてる数字がある時、どうやってその数字を探し出しますか?」 : IT速報

※ 2015/01/24 12:00更新

Twitterで別解が集まりましたので、本記事末尾に追記しました。

きっともっとスマートなやり方があると思いますが、とりあえずこんな感じでやりました。数字の書いてあるファイルを「nums」としています。

$ expr $(seq 1 250 | awk 'BEGIN{sum=0}{sum=sum+$1}END{print sum}') - $(awk 'BEGIN{sum=0}{sum=sum+$1}END{print sum}' nums)

…続きを読む