SQLは解析が非常に困難です。あなたのデータがかなりシンプルで、あなたのSQLがかなり規則的であれば、希望通りの方法でawkを使うことができます。個人的には、データベースに挿入された値を調べ、それらのスクリプトをスキャンするか、またはその逆の可能性があります。または、一連のprint文を挿入し、エラーメッセージがどこに挿入されているかを確認します。 awkでの最善の結果を期待
、のは、それに古い大学の試みを与えてみましょう:tr
で
$ cat dat
INSERT INTO table (
one,
two,
three
)
VALUES (123, 'lorem', 'ipsum');
INSERT INTO table (
one,
three
)
VALUES (123, 'lorem', 'ipsum');
$ tr -d \\n < dat | sed 's/;/&\
/g' | awk -F '[()]' 'split($2, cols, /, /) != split($4, vals, /, /) {print}'
INSERT INTO table (one, three)VALUES (123, 'lorem', 'ipsum');
は、我々は改行を削除します。 sed
では、各SQL文(末尾に;
で終わる)を1行に配置します。 awk
では、括弧を区切り文字として各行を分割して、列が$2
で、値が$4
になるようにしました。 split
コマンドは、それぞれにいくつのフィールドがあるかを返します。いずれの場合もカンマを区切り文字として使用します。一致しない場合は、行を出力します。表示される最後の行は、列名two
が存在しないため出力です。
これは、あなたのケースでは恐ろしいものではないかもしれない、いくつかの偽陽性を返す可能性があります。データにセミコロンまたはカンマがある場合、分割は間違っています。 INSERTに列名が記載されていない場合は間違っています。挿入されていない文がある場合は、それらをフィルタリングしたり、別の方法で処理したりする必要があります。
SQL文字列値を一重引用符で囲む必要はありませんか? –
また、生成されたファイルには '\ r \ n'という行末がありますか? –
私は別の質問をしましたが、似たような性質のものがあまりにもずっと前です。見てみると、これから一緒に何かを作ることができるかどうか試してみてください。http://stackoverflow.com/questions/38807810/bash-cut-and-paste-sql -insert-statement @glennjackmanええと、文字列の値は、SQLの一重引用符で囲む必要があります。 – dood