3

データベースから列を削除した後、AWK を使用して長い SQL スクリプトを変更しようとしています。

変更しようとしている行:

INSERT INTO `table` (`one`, `two`, `three`, `four`, `five`, `six`) VALUES ('alpha', 'bravo', 'charlie', 'delta', 'echo', 'foxtrot');

私のAWKスクリプト:

BEGIN { 
    FS=","
} 
/`table`/ { $3=$8=""; print }

私が実行するもの:

awk -f script.awk in.sql > out.sql

これは、すべてのフィールドセパレーター(コンマ)を削除するように見えることを除いて、私がやりたいことをほとんど行います:

INSERT INTO `table` (`one`  `two`   `four`  `five`  `six`) VALUES ('alpha'  'bravo'   'delta'  'echo'  'foxtrot');

私が期待していたのは二重コンマで、gsub などを使用して単一のコンマに置き換える必要があります。

コンマに何が起こっているのですか?

4

2 に答える 2

1

フィールドに値を割り当てると、awk は出力フィールド区切り記号 (OFS) を使用して入力レコードを再構築します。次の 2 つの選択肢があります。

  1. コンマを使用してレコードを再構築するFS=OFS=","代わりに設定するか、FS=","
  2. フィールドに値を割り当てるのではなく、RE を使用してレコード全体を操作します。

「1」を実行する方法はすでに知っており、空のフィールドを削除するために二重の OFS を削除する必要があることを知っています。gensub() に GNU awk を使用して「2」を実行する方法は次のとおりです。

$ awk '{print gensub(/(([^,]+,){2})[^,]+,(([^,]+,){4})[^,]+,/,"\\1\\3","")}' file
INSERT INTO `table` (`one`, `two`, `four`, `five`, `six`) VALUES ('alpha', 'bravo', 'delta', 'echo', 'foxtrot');

個々のフィールドで何もしていないため、FS または OFS を指定する必要はなく、レコードは再コンパイルされないため、エラーが発生しやすい結果の空のフィールドを削除する必要がないことに注意してください。

必要に応じて、sed でも同じことができます。

于 2013-10-04T14:38:52.757 に答える