0

データベースに多数のビューがあり、各ビュー内の選択ステートメントを更新する必要があります。

viewname.txtというファイル内のすべての select ステートメントを1 つのディレクトリと sql というサブディレクトリに格納しています。私はすべてのビューviewname.sqlを持っています。スクリプトを実行してviewname.txtからテキストを取得し、sqlサブディレクトリの正しいviewname.sqlのselectステートメントを置き換えたいと思います。

これを試して、各 .sql ファイルの SELECT の後にテキストを追加しました。

for i in */*; do
  if ["../$(basename "${i}")" == "$(basename "${i}")"]
  then
    sed '/SELECT/a "$(basename "$i" .txt)"' "$(basename "$i" .sql)"
  fi
done

どんな支援も大歓迎です!

ディッキー

4

1 に答える 1

1

これは近い awk の回答です。出力は、対応する「viewname.sql.new」ファイルの下の sql ディレクトリに配置されます。

#!/usr/bin/awk -f

# absorb the whole viewname.txt file into arr when the first line is read
FILENAME ~ /\.txt$/ && FILENAME != last_filename {
    last_filename = FILENAME

    # get the viewname part of the file name
    split( FILENAME, file_arr, "." )

    while( getline file_data <FILENAME > 0 ) {
        old_data = arr[ file_arr[ 1 ] ]
        arr[ file_arr[ 1 ] ] = \
            old_data (old_data == "" ? "" : "\n") file_data
    }
    next
}

# process each line of the sql/viewname.sql files
FILENAME ~ /\.sql$/ {
    # strip the "/sql" from the front of FILENAME for lookup in arr
    split( substr( FILENAME, 5 ), file_arr, "." )
    if( file_arr[ 1 ] in arr ) {
        if( $0 ~ /SELECT/ )
            print arr[ file_arr[ 1 ] ] > FILENAME ".new"
        else
            print $0 > FILENAME ".new"
    }
}

awkoこれをandというファイルに入れてchmod +x、次のように実行しました

awko *.txt sql/*

新しいファイルを所定の位置に移動する必要がありますが、今できる限り近いものです。

于 2013-08-16T01:24:14.413 に答える