私は、1つのデータベースだけが必要な、比較的大きな(250G)MySQLダンプファイルを持っています。awkファイルを分割するために検索してみたところ見つかったこの表現:
awk '/START/{x="F"++i;}{print > x;}' file2
良いスタートのように思えます (そしてサンプル ファイルを使用してもうまく動作します) が、次のように実行します。
awk '/CREATE DATABASE/{x="F"++i;}{print > x;}' file2
次のようなエラーが発生します:
awk: (FILENAME=dump_all.sql FNR=1) fatal: expression for `>' redirection has null string value
他のページ (SE から) では、これは空白行に達したことが原因であると報告されています。
このファイルから必要な部分を取得するためにこのテクニックを使いたいのですが、awk構文は(明らかに)かなり制限されています。これを機能させる方法はありますか?
答え1
これで実際の問題が解決するかどうかはわかりません。実際の入力ファイルを見せてもらえないので、あなたが試みていることがうまくいくかどうかもわかりません。いずれにせよ、発生しているエラーを修正するには、次のコードを使用してください。
awk '/CREATE DATABASE/{x="F"++i;}(x){print > x;}' file2
これにより、スクリプトはx
変数がx
設定されている場合にのみファイルへの印刷を試行するように変更されます。発生したエラーは、すべての行を印刷しようとしたために発生しました。その行の一部は、設定されてCREATE DATABASE
いない文字列より前の行であるx
ようです。上記のスクリプトは、次のように記述するのと同じです。
awk '{
if(/CREATE DATABASE/){i=i+1; x="F"i;}
if(x!=NULL){print > x }
}' file2