アクセスログの解析などで awk は非常に重宝します。
区切り文字を指定すると、パースされた列(カラム)の値を簡単に表示することができます。
しかし表示したい列が多くなると、カラムの指定も多くなるのでちょっとかっこ悪くなってしまう場合もあります。
特定の範囲だけ値をフィルタリングできないか調べてみました。
3列目から5列目までを抜き出す
例えば、カンマ区切りで 6 個の項目がある場合、3 列目から 5 列目までの文字だけ抜き出す方法はないかなっと調べてみましたが、用途に一致する方法が見つかりませんでした。
下記は、6 個のカンマで区切られた文字列から C と E だけ抜き出したい場合の例です。
1 2 3 4 | $ cat rilakkuma.txt A,B,C,D,E,F $ awk -F',' '{print $3" "$5}' rilakkuma.txt C D |
上記のように 3 番目と 5 番目のカラムを抜き出すのは $3 や $5 を指定すればいいのですが、$3 から $5 など特定の範囲を抜き出すにはどうすればいいのでしょうか。
($3-$5 や $3:$5 などは使えません)
やはり for 文などを使ってコーディングしないといけないのかなぁ。
$0を活用する
を活用する
ちなみに $0 で全項目を出力することができるのですが、これを利用すれば最後の項目だけ表示しないなどちょっとした調整なら可能になります。
1 2 | $ awk -F',' '{OFS=",";$6="";print $0}' rilakkuma.txt A,B,C,D,E, |
1 2 | $ awk -F',' '{OFS=",";$4="";$6="";print $0}' rilakkuma.txt A,B,C,,E, |
組み込み変数や組み込み関数をうまく利用していけば、もっと複雑なことができそうです。
主な組み込み変数だけ書き残しておきます。NF も使う機会が多いでしょうか。
NF : 現在レコードのフィールド数
OFS : 表示のフィールドセパレータ