awk を使用して MySQL ダンプを分割する

awk を使用して MySQL ダンプを分割する

私は、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  

関連情報