本日は UPS友の会

本日土曜日は 8:00AMに自宅を出発し、電車で麹町まででかけています これは USP友の会が開催している シェル芸勉強会に出席するためです

何時もはとても難しくついていけそうもないのですが、今日は特別に初心者向けに開催して下さっているのです とは言っても参加者の年齢は皆せいぜい 30歳、僕だけ超年寄りですので浮いていますがそれでも頑張って参加しています

皆さんパソコンを持込み、プログラム書いて勉強しています 頑張るぞ

one linerの例

前回にも述べた awkの話です

$ seq 1 20 | xargs -n 5

これで出力は

1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20

となります 要するに seqにより 1 から 20の連続する整数を出力し、それを pipeで xargsに流し込み、オプションにより 5列に整形した結果です

これに awkを用いると

$ seq 1 20 | xargs -n 5 | awk '{print $1 $3 $5}'

のようにすれば、その5列の表の 一列目、三列目、五列目が出力されます その結果は

135
6810
111315
161820

となり列と列が隙間なくうまり分かりにくくなります これに対して

$ seq 1 20 | xargs -n 5 | awk '{print $1"\t"$3"\t"$5}'

とすれば 列の間に tabが挿入され

1	3	5
6	8	10
11	13	15
16	18	20

のように非常に分かりやすくなります こんなことをワシントンDCのラウンジで行っています

やったね 難問解決

今、プログラミングをもっと効率的に行える自分になれるように Shellプログラミングの勉強をゆっくりと初めています

これを使いこなせるようになれば、自動で色々な変換をしたりできるようになる筈です

とはいうものの、なかなか厳しい世界です 簡単なことでもすぐに挫折してしまいます 実際昨日から今日にかけてぶち当たったのが

username$ brew install coreutils

このように homebrewを用いて coreutilsをインストールしたにもかかわらず symlinkができていない、というエラーが homebrewからはかれたのです

用いたいコマンドは sedとawkなのです そして、色々調べたところ以下のようにして解決しました

usename$ brew link coreutils

さてこのように symlinkを作成したところ、検証のために以下のコマンド入れると

username$ which awk
/usr/local/bin/awk
username$ ls -l /usr/local/bin/awk
lrwxr-xr-x 1 username admin 28  6  9 13:27 /usr/local/bin/awk -> ../Cellar/gawk/4.1.3/bin/awk*

とこのようにawkがgawkにリンクされたことが分かります

実際に以下のようにawkが正しく日本語を処理できる gawkにリンクされたことは検証できました

username$ echo 山田 | awk '{gsub(/^./,"上",$1);print}'
上田

このように”山田”という文字列が、正しく日本語として判定され、その第一文字目が”上”に変換され、その結果 “上田”がコンソールに出力されています

これは「小さな一歩であるが、未来に続く一歩である」なんてねね

awk

Unix toolの一つとして昔から存在し、それを使用すれば信じられないプログラミングを Shellで行うことができるものとして、SEDと AWKがあります

この両者に対して僕はこれまで全く無知であり、また関心もありませんでしたが、先日 Shell programmingの本を Kindleで読んでいて急に興味を持ちました そして、昨日からその勉強を開始しました

当初訳が分からなかったこんなプログラム これは Shell + AWKですが

$seq 1 10 | awk 'BEGIN {x = 0} {x += $0} END {print x}'

というのも現在では理解できます
このone liner program (一行プログラム)の意味するところは、

  1. 1から 10の整数を用意する
  2. 次に、最初だけ変数 xに 0を代入する
  3. それから用意した整数をxに畳み足していく
  4. 最後に変数 xの値を表示する

というものです もちろん回答出力は 55です