- ベストアンサー
AWKのセパレーター
AWKで使用するフィールドセパレーターは”-F”オプションで変更できると思うのですが、 フィールドセパレーターを複数同時に指定することはできるのでしょうか? 例えば、スペースと"("、")"、"[”、"]"を同時にセパレータとして使用することはできるのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
おそらく現在の多くのawkでは#2さんのでもいいですけど、 FS="[][() ]+" が本来の正規表現の書き方です。文字 ] は [ の直後に書きます。この場合は閉じカッコとみなされません。また、[ ] の内部の [ も特殊文字でない。 [ ] 内に書く順序に注意すれば [ ] に \によるエスケープは必要ありません。というか古いプログラムだと [ ] 内では \ はエスケープの意味を持たないかもしれません。つまり、古いawkだと、FS="[ \\[\\]()]+" だと正しく解釈してくれないかもしれません。まあ、今時そんな古いawkを使うことは無いでしょうけど。
その他の回答 (2)
- bikkuri
- ベストアンサー率33% (23/68)
No1さん、おしい!! FS="[ \\[\\]()]" にすれば、 MN が表示されましたよ。 (括弧の前の\は不要でした) ただし、$9で、0.5を取得したいのでしたら FS="[ \\[\\]()]+" としないと、ダメでした。
- toysmith
- ベストアンサー率37% (570/1525)
変数FS(-Fオプションで設定される変数)の意味合いは… FSが1文字のとき:その文字がセパレータ FSが空文字のとき:個々の文字がセパレータ FSが1文字の空白のとき:空白・タブ・改行がセパレータ それ以外のとき:FSを正規表現とする 正規表現で書いてやれば出きるのでは? と想像してみました。 FS="[ \[\]\(\)]" 今、手元に環境が無いので実験してません。 実験してみてください。
補足
試してみました。うまくいってないようです。 以下のようなスクリプトで実行してみました。 #!/bin/nawk -f BEGIN{ FS="[ \[\]\(\)]" } { print $2; } サンプルデータは DEVICE MN(NQN) V2NG POLS NSD NSD PSUB [0.5] このようなデータが複数行あるものです。 ”print $1”とすると行が全て表示されます。 ”print $2"以降を表示させようとすると空白 行が出力されます。
お礼
大変参考になりました。この機能はいろいろ応用がききそうなので、今後、活用させていただきます。