読者です 読者をやめる 読者になる 読者になる

Bye Bye Moore

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

awkのgsub/sub関数でマッチした文字の前後に細工をしたい場合

awk

awkのgsub/sub関数でマッチした文字の前後に細工をしたい場合、 マッチした文字をキャプチャしてくれるのは"&"です。 実際のところ たとえばgsubなら $ echo 12345678 | awk 'gsub(/[0-9][0-9]/, "&-")' 12-34-56-78- $ echo abc | awk ' gsub(/あ*/, " // &…

AWKの関数呼び出しは入れ子構造にできる

awk

AWKの関数呼び出しはrubyのように入れ子にできます。 実際のところ shuzo-kino.hateblo.jp でやった日付呼び出しの例を考えてみます。これが $ awk 'BEGIN {the_time = strftime("%y%m%d%H%M%S"); print the_time}'こうなります $ awk "BEGIN {print strftim…

awkのprint文は出力先としてファイルを指定できる

awk

awkのprint文はファイルを出力先として指定できます。 一個のawkファイルで出力先を複数指定できます。 実際のところ 以下の様なファイルがあっとします。 $ cat sample0719.txt cat cat dog person catこれを、以下の様なawkファイルに掛けると…… BEGIN { c…

awkにおいて、演算子"~"は特定の文字列を含んでいる場合"1"を返す

awk

一致すると、"1"を返します。 $ printf "foo bar buzz" | awk '{print $0 ~ /ba/}' 1否定版もあります。 $ printf "foo bar buzz" | awk '{print $0 !~ /bar/}' 0条件式に組み込むこともできるので、知ってると少し短く書けるかも $ printf "foo bar buzz" |…

Gitでコミット数を知るワンライナー

Gitでコミットした量を知るワンライナーです。 git logは各種ログがでてきますが、awkでこれの”Date”分を抽出し、"uniq -c"で出てきた個数を数えると……コミット回数をリストアップできます。 $ git log | awk '/Date/{print " : " $4 " " $3 " " $6}' | uniq…

awkにおける変数設定オプションとファイルの順番について

awk

awkにおける変数設定オプションとファイルの順番は「変数設定オプション」=>「ファイル」の順です。 実際のところ $ tail sample.txt sample2.txt ==> sample.txt <== a b c d e f 89 01 23 45 61 31 94 ==> sample2.txt <== GNU EMACS PYTHON RUBY $ gawk '…

Javascriptでawkが動く。魔界ライブラリWebAWK

awk

WebAWKは、Javascript実装のAWKです。 オンラインでもは此方。 WebAWK - client-side awk in Javascript導入は簡単です。 gitからコードを導入し…… $ git clone git://github.com/agordon/webawk.git $ cd webawk/仮ビルド=>必要な形態にビルド。 まずは試し…

awkで標準出力に表示された数値を数値型で扱う3つの方法

awk

ゼロ加算 awk界隈ではよく見かける方法です。 printf記法、print記法共に16進数は予定通り動いてくれないので注意が必要です。 $ echo 123 0x123 | gawk '{print $1+0, $2+0}' 123 0 $ echo 123 0x123 | gawk '{printf "%d %d\n", $1+0, $2+0}' 123 0 strton…

awkプログラムを単独実行可能な状態にしておく

awk

ある程度スクリプトの内容が熟れてきたら、 awkスクリプトの単独実行を検討してみるのもいいでしょう。 実際のところ 標準出力から数字列を受け取り、fizzbuzzの個数を受け取る以下のようなスクリプトがあったとします。 BEGIN { count = 0 } $1 % 3 == 0 &&…

awkでredisやXML、PostgreSQLを使う魔界拡張

awk

gawkには、「gawkextlib」という外部拡張群が用意されています。 公式から文言を引用すると The gawkextlib project provides a number of gawk extensions, including one for processing XML files. XML読み込みを主目的に開発された事がわかります。実際…

awkの文字列系便利関数

awk

awkの文字列系便利関数はデフォルトでいくつかついてます。 RubyやPythonに慣れていれば大体挙動は同じです。 メソッドチェインみたいな事は不得手ですが。 文字列系便利関数 index 先頭からの文字数をカウントする関数です。 1文字以上の文字列に一致、そ…

awkにもsplit関数がある

awk

配列といえば、おなじみsplit関数。 awkにもあります。 ちょっと便利な機能がついて。 実際のところ 普通に使うだけなら、変数は2個です。 分割する文字列、格納先の配列という順。 $ gawk 'BEGIN{a ="Hello World, yo"; split(a, ary); print ary[1]}' Hel…

配列の内容を消すときにはdelete

awk

awkで配列のカラムを消す時は delete ary[index] です 実際のところ BEGIN { PROCINFO["sorted_in"] = "@ind_str_asc" ary[3] = "j" ary[1] = "t" ary[2] = "a" ary[0] = "b" delete ary[2] for (i in ary) print i, ary[i] } #>> 0 b #>> 1 t #>> 3 j 参考…

配列の格納順を決める変数PROCINFO["sorted_in"]

awk

AWKで配列の格納順を決める変数として、PROCINFO["sorted_in"]があります。 実際のところ 以下のようなスクリプトがあったとします。 BEGIN { PROCINFO["sorted_in"] = val ary[3] = "j" ary[1] = "t" ary[2] = "a" ary[0] = "b" for (i in ary) print i, ar…

awkの配列をfor文で順繰りに読む

awk

awkの配列をfor文で順繰りに読む場合、 eachのような気の利いた関数はないので、 シェルなどと同様 for ( NUM in ARY )てな書き方になります。 実際のところ BEGIN { a["here"] = "here" a["is"] = "is" a["a"] = "a" a["loop"] = "loop" for (i in a) { j++…

awkでARGV系変数を扱う

awk

awkにも、引数を取得するARGV系変数があります。 引数の総数を見るARGCという便利変数もついてるので、やりようによっては色々応用が効く可能性があります。 実際のところ 引数で変数A、Bを定義し、awkスクリプト内で参照するようなスクリプトの場合、 もっ…

awkの-vオプションで初期値を与える

awk

awkの-vオプションは初期値を与えるオプションです。 似た処理を変数変えてやりたい時に有効ですね。 実際のところ $ gawk -v A=2 'END{ printf "A:%d + B:%d\n", A, B}' B=4 /dev/null A:2 + B:4最後にある/dev/nullがミソです。 これがないと、無限参照で…

awkスクリプト内部で、他のファイルに記述した設定を呼び出したい場合

awk

awkスクリプト内部で、他のファイルに記述した設定を呼び出したい場合ってありますよね。 この場合、標準拡張のreadfileかrwarryを使うと良いです。 実際のところ readfile 単純にファイルを読み出すだけなら、以下のような感じでいけます。 一本の文字列と…

tac的な事をやるライブラリ「revoutput」

awk

たまにawkでtac……つまり逆読み的な事をやる例題がありますね。 ああいった事をやる場合、実は標準添付ライブラリの「revoutput」を使うと苦労もなくいけます。 $ gawk '@load "revoutput"; BEGIN { REVOUT=1; print "sample string" > "/dev/stdout"}' gnirt…

AWKにもstrtime関数がある。ただし、timeライブラリと合わせてつかう。

awk

Ruby等々の軽量言語でもお馴染み、時刻を返すstrftime関数、AWKにもちゃんとあります。 使い方に一手間かかりますが、あとの使い勝手はなんら変わりません。 実際のところ strftime関数を呼び出すだけなら、ライブラリ不要です。 ただし、そのまんま呼び出し…

AWKでUNIXコマンドの結果を内部的に使いたい場合「|」でつないでやる

awk

AWKでUNIXコマンドの結果を内部的に使いたい場合「|」でつないでやるだけで大丈夫です。 実際のところ 単純に結果が欲しいだけなら、以下のようにつなぐだけです。 $ gawk 'BEGIN {"date" | getline result; print result}' 2015年 10月12日 月曜日 23時47分…

AWKで置換後のバックアップファイルを残しておきたい場合、「inplace」ライブラリが使える。 

awk

awk組み込みのinplaceは置換後のバックアップファイルを取るときに非常に便利です。 公式では、 The inplace extension emulates GNU sed’s -i option, which performs “in-place” editing of each input file. It uses the bundled inplace.awk include fil…

awkの組み込み拡張機能を使うときは「@load」を使う

awk

AWKには予め拡張ライブラリがいくつか用意されています。 これらは@loadで読み出す事で利用可能です。 実際のところ 呼び出し方 数値をascii文字に拡張するライブラリordchrを使ってみます。 これを読み出し、97(='a')を変換するには以下のようにします。 $ …

awkの出力先はfdも指定可能

awk

Besides the /dev/stdin, /dev/stdout, and /dev/stderr special file names mentionedearlier, gawk provides syntax for accessing any other inherited open file: /dev/fd/Nとあるように、awkでは通常のstdin、stdout、stderrの3人組に加えて 自分で指…

awkにおけるgetlineのバッドノウハウを消し去る構文「c&&!--c;」についてちゃんと理解する

awk

以前の記事で書いた、以下のようなgetlineを使うバッドパターンを考えます。 三行目にマッチし、その二行あとを捕獲して表示する例です。 $ seq 1 10 | gawk '/3/{getline; getline; print}' これは、getlineを使わない形で以下のように書き換わります。 $ s…

変数NRは上書きできる

awk

行数を示す変数NRについては、何度か記事にしてきました。shuzo-kino.hateblo.jp shuzo-kino.hateblo.jp実は、この変数……処理中に値を上書きできます。 実際のところ 2行目になったら、NRを42になるようにしてみます。 NRは行を送る毎に一加算されていくの…

AWKにおけるバッドパターン、getlineの多用について

awk

getlineは、大雑把にいうと……条件にあった行を取得しに行く組み込み関数です。 たとえば、3行目から2個先の行を取る場合、こんな風に。 $ seq 1 10 | gawk '/3/{getline; getline; print}' 5 あるいは、入力を既存ファイルの内容で割り込みさせるとか $ se…

AWKで変数を含んだ文字列を生成したい場合、余計な事を考えずに並べるだけでいい

awk

awkのデータ型は自由です。 数値と文字列が混在していても、よろしくやってくれます。 これらを連結したい場合、余計な事を考えずスペース区切りで並べてあげるだけです。 実際のところ 既存の変数に数値を足した変数を生成したい場合、単に並べてあげるだけ…

よく使う関数はawkスクリプトとして保存して適時読み出すと楽

awk

よく使う関数はawkスクリプトとして保存して適時読み出すと楽になるケースがあります。 awkスクリプトは-fオプションで読み込みます。 その後で、ワンライナーやら何やらが使えるので使いどころによっては重宝します。 実際のところ 参考もとのモノをベース…

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... …