本日土曜日は 8:00AMに自宅を出発し、電車で麹町まででかけています これは USP友の会が開催している シェル芸勉強会に出席するためです
何時もはとても難しくついていけそうもないのですが、今日は特別に初心者向けに開催して下さっているのです とは言っても参加者の年齢は皆せいぜい 30歳、僕だけ超年寄りですので浮いていますがそれでも頑張って参加しています
皆さんパソコンを持込み、プログラム書いて勉強しています 頑張るぞ
本日土曜日は 8:00AMに自宅を出発し、電車で麹町まででかけています これは USP友の会が開催している シェル芸勉強会に出席するためです
何時もはとても難しくついていけそうもないのですが、今日は特別に初心者向けに開催して下さっているのです とは言っても参加者の年齢は皆せいぜい 30歳、僕だけ超年寄りですので浮いていますがそれでも頑張って参加しています
皆さんパソコンを持込み、プログラム書いて勉強しています 頑張るぞ
前回にも述べた 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}' 上田
このように”山田”という文字列が、正しく日本語として判定され、その第一文字目が”上”に変換され、その結果 “上田”がコンソールに出力されています
これは「小さな一歩であるが、未来に続く一歩である」なんてねね
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 (一行プログラム)の意味するところは、
というものです もちろん回答出力は 55です