• ベストアンサー

AWKのセパレーター

AWKで使用するフィールドセパレーターは”-F”オプションで変更できると思うのですが、 フィールドセパレーターを複数同時に指定することはできるのでしょうか? 例えば、スペースと"("、")"、"[”、"]"を同時にセパレータとして使用することはできるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4901/10362)
回答No.3

おそらく現在の多くのawkでは#2さんのでもいいですけど、 FS="[][() ]+" が本来の正規表現の書き方です。文字 ] は [ の直後に書きます。この場合は閉じカッコとみなされません。また、[ ] の内部の [ も特殊文字でない。 [ ] 内に書く順序に注意すれば [ ] に \によるエスケープは必要ありません。というか古いプログラムだと [ ] 内では \ はエスケープの意味を持たないかもしれません。つまり、古いawkだと、FS="[ \\[\\]()]+" だと正しく解釈してくれないかもしれません。まあ、今時そんな古いawkを使うことは無いでしょうけど。

Kasaoka-Taroh
質問者

お礼

大変参考になりました。この機能はいろいろ応用がききそうなので、今後、活用させていただきます。

その他の回答 (2)

  • bikkuri
  • ベストアンサー率33% (23/68)
回答No.2

No1さん、おしい!! FS="[ \\[\\]()]" にすれば、 MN が表示されましたよ。 (括弧の前の\は不要でした) ただし、$9で、0.5を取得したいのでしたら FS="[ \\[\\]()]+" としないと、ダメでした。

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.1

変数FS(-Fオプションで設定される変数)の意味合いは… FSが1文字のとき:その文字がセパレータ FSが空文字のとき:個々の文字がセパレータ FSが1文字の空白のとき:空白・タブ・改行がセパレータ それ以外のとき:FSを正規表現とする 正規表現で書いてやれば出きるのでは? と想像してみました。 FS="[ \[\]\(\)]" 今、手元に環境が無いので実験してません。 実験してみてください。

参考URL:
http://www.linux.or.jp/JM/html/GNU_gawk/man1/gawk.1.html
Kasaoka-Taroh
質問者

補足

試してみました。うまくいってないようです。 以下のようなスクリプトで実行してみました。 #!/bin/nawk -f BEGIN{ FS="[ \[\]\(\)]" } { print $2; } サンプルデータは DEVICE MN(NQN) V2NG POLS NSD NSD PSUB [0.5] このようなデータが複数行あるものです。 ”print $1”とすると行が全て表示されます。 ”print $2"以降を表示させようとすると空白 行が出力されます。

関連するQ&A