AWK覚え書き

表現一部変更して清書しました。
仕事の都合でAWKを触る機会があったため、折角だからメモしておきます。
The GNU Awk User's Guide - Table of Contentsを参考にしました。

セパレータの指定

  • 入力のレコード・セパレータを指定する場合は、RSで指定する*1
  • 入力のフィールド・セパレータは、-Fオプションか、FSで指定する。
    • ただし、セパレータを16進指定する場合(正規表現を利用)は、Fオプションだと失敗しました。
  • print $1, $2のようにカンマで区切ると半角スペース(0x20)で区切られる。
    • 出力のフィールド・セパレータを変更するには、-vオプションか、OFSで指定する。
    • カンマがないと、区切り文字なしで出力されます。
  • 出力の改行コードは標準だと\n = LF(0x0a)
    • 環境による?
    • ORSで指定可。
  • 文字のバイト値を16進で指定する場合、"\xhh"を使うようです。

全然参考にならない例

入力改行=LF, フィールドセパレータ=0x20(単なる空白), 出力改行=CR+LF,
出力フィールドセパレータ=0x2c(単なるカンマ)で、2番目と3番目のフィールドだけ出力したい場合。

awk 'BEGIN{FS="\x20"; OFS="\x2c"; ORS="\x0d\x0a";}; {print $2, $3}' ファイル名

いや、普通にやった方が早いんですが…。

*1:処理タイミングを考えると、BEGINで書いた方が確実というか筋みたいですが、アクションのブロックに書いても動作しました。なお、後述のFSも同様でした。「BEGINルールは何等かの入力が行われる前に実行される」ため、確実にRSやFSの指定をする場合は、BEGINのアクションに記述する必要があるようです。The GNU Awk User's Guide - パターンとアクション及びThe GNU Awk User's Guide - 入力ファイルの読み込み参照。