Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

awk

AWKでRSSデータを扱うときには「myrss」を使うと便利

awk

導入 $ wget http://lawker.googlecode.com/svn/fridge/lib/awk/myrss.awk 使い方 $ gawk -f myrss.awk --source 'BEGIN { print "<ul>"; print myrss("rss;lawker.bl ogspot.com/feeds/posts/default?alt=rss;5","<li>\n"); print "</ul>" }' <ul> <a href="">Mar 01</a>Michael Sanders dem</ul>…

AWKでも連続して変数を代入できる

awk

AWKでも連続して変数を代入することができます。 同じ値を複数のフィールドに突っ込む場合に特に有効です。 実際のところ 1、2、最終のフィールドを"nil"としたい場合を考えます。 この場合、以下のように=で変数を結んであげるだけで連続して指定できます…

awkでEND部分の変数に+0をつける慣習について

awk

人様の書いたawkスクリプトをみてると、時折END部分で変数に+0をつけるものがあったりします。 たとえば、こんな感じ。 $ cat data.csv | awk '/Saitama/{tot++} END{print tot+0}' 2これは、awkの変数がjavascriptと同様かなり自由度が高いことと関係してい…

非POSIX環境のAWKでバイナリデータを弄り回したい場合、BINMODEオプションが使える

awk

非POSIX環境の場合、改行ルールが違ったりパスの記法が異なったりで若干使い勝手が変わるケースがあります。 こういう場合、gawkやmawk、cygwinのawkに実装されているBINMODEオプションを使うと挙動をPOSIX準拠にすることができます。 If BINMODE is `"r"', …

NRとFNRのちがい

awk

NRとFNRのちがいは、 NRが通し番号なのに対して、FNRがファイル毎に振られる番号であるという点があります。 実際のところ 以下のようなファイルがあったとします。 $ tail 111.txt 000.txt ==> 111.txt <== abc withdrawal def payment xyz deposit xxx bal…

特定のカラム”だけ”不要という場合、あえて空白文字化してしまう手もある

awk

カラムの大半が必要だけど、 アタマの通し番号が邪魔だな…… 末尾の注釈が要らないなぁ…… 等々、特定のカラム”だけ”不要という場合、あえてその部分だけ空白文字化してしまう手もあります。 実際のところ 前回扱った日本の都市情報のうち、最初と最後のカラム…

NFと$NFの違い

awk

特殊変数のNFと$NFは、それぞれ明らかに異なった動きをします。 前者は項目数、後者は最後の項目の内容を格納しています。 実際のところ 以下のようなファイルがあったとします。 $ cat sample.txt foo vivit 42 bar 10 buzz 34 piyo 11これについて、NFと$N…

AWKでもwc的なことができる上に便利

awk

AWKでもwc的なことができます。 その上、そのままprintfにつなげたり、正規表現を使うことができたりで便利です。 実際のところ List of Japanese cities by population - Wikipedia, the free encyclopediaから作成した 日本の都市名リストを使い、検証して…

AWKのORS変数を設定すれば、レコードを特定の文字で結合できる

awk

ORS変数は出力レコードを特定の文字で結合できるものです。 実際のところ $ seq 20 30 | awk 'ORS=NR%5?", ":"\n"' 20, 21, 22, 23, 24 25, 26, 27, 28, 29一部の資料では"ORS=%NR%5"とかNRの前に入ってますが、誤植です。他のスクリプトで似た事やるのはち…

AWKのOFS変数を設定すれば、要素間の区切り文字を設定できる

awk

AWKの要素間の区切り文字はデフォでは空白文字です。 これを設定するのがOFS変数です。 実際のところ 各要素を"***¥n"で区切りたい場合を考えてみましょう。 前回のものをベースにする場合、OFSの部分を以下のように追加します。 BEGIN {OFS="***\n"; FS="</item>\n…

AWKのFSは単体の文字で無くてもいい

awk

Yahoo!ニュース・トピックス - サイエンス から、RSSのファイルを取得してきます。 $ curl http://news.yahoo.co.jp/pickup/science/rss.xml > rss.xml $ cat rss.xml | nl 1 2 <rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" version="2.0"> 3 <channel> 4 <title>Yahoo!ニュース・トピックス - サイ…</channel></rss>

AWKで特定の条件に一致する行数をカウントする

awk

BEGINとENDを使えば、特定条件に一致した行をカウントするのも比較的楽にできます。 BEGIN { count = 0 } $1 % 3 == 0 && $1 % 5 == 0 { count = count+1 } END { print "I found " count " fizzbuzz numbers. :)" }てなファイルを用意した上で $ seq 1 100 …

AWKで表示する行範囲を指定する

awk

AWKでは、ANDやORを使った条件指定ができます。 これと行番号を意味するNRを組み合わせることで行範囲を指定することができます。 実際のところ たとえば……4行目から7行目までを表示したいなんてケースがあった場合、 $ seq 1 100 | awk '( NR < 3 ) && (N…

awkのカラム番号変数内部でも演算ができる

awk

awkはカラム番号を指定すると、その番号分を出力してくれます。 $ printf "as you like\n" | awk '{ print $(1) }' as 0なら、全部出力。 $ printf "as you like\n" | awk '{ print $(0) }' as you like で、この変数ですが番号を与えればいいだけなので……内…

指定日以前の不要ブランチをまとめて消す

前回の続きっぽい記事です。手当たり次第ブランチを切りまくっていると、問題になってくるのが不要ブランチの処分。 実験用のお砂場として弄り回した果てに存在すら忘れていたのがチラホラ... 以前も似たような事をやりましたが、あのバージョンだと日付以降…

FSはFile Separatorの略であり、Field Separatorの略でもある

以前のCLI_YAMLパーサ解析の続きです。 local fs=$(echo @|tr @ '\034') sed -ne "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" \ -e "s|^\($s\)\($w\)$s:$s\(.*\)$s\$|\1$fs\2$fs\3|p" $1 | awk -F$fs '{ .... }色々調べた所、どうもsedは\034... …