ここにシーンがあります
テーブル名(10個のテーブルがあると仮定)を含むリストファイルと、生成されたすべてのDDLのうち約100個を含む別のファイルがあります。
2番目のファイルから最初のファイルにあるテーブルの生成DDLSを抽出する必要があります。私はsed
コマンドを使ってこれを達成しました。ただし、複数のテーブルと最初のファイルにないいくつかの追加テーブルに対して、私のコマンドが2回コピーされるという問題が発生しました。
フロント用;
私のList_File.txt
もの
ACASE
ABC
ABCH
CREATE_DDLS.txt
持つ
CREATE TABLE <SCHEMA_NAME>.ACASE
(
COLUMN1,
COLUMN2,
COLUMN3
) ;
CREATE TABLE <SCHEMA_NAME>.ACASE01
(
COLUMN1,
COLUMN2,
COLUMN3
) ;
CREATE TABLE <SCHEMA_NAME>.ACASE03
(
COLUMN1,
COLUMN2,
COLUMN3
);
CREATE TABLE <SCHEMA_NAME>.ABC
(
COLUMN1,
COLUMN2,
COLUMN3
) ;
CREATE TABLE <SCHEMA_NAME>.ABCD
(
COLUMN1,
COLUMN2,
COLUMN3
) ;
シーン1:
ACASE はリスト・ファイルにあり、2 番目のファイルには ACASE/ACASE01/ACASE03 があります。次のコマンドは 3 つのテーブルをすべてコピーし、出力に DDL を生成するには ACASE が必要です。
シナリオ 2:
ABCとABCDはリストファイルに存在し、コマンドはABCDテーブルを2回出力しますが、ABCDは1つだけ必要です。
以下は私が実行するコマンドです
while read -r line
do
sed -n '/CREATE TABLE SCHEMANAME.TABLENAME/,/\;/p' Create DDLS file
done < List file > NewFile.txt
どんな助けでも大変感謝します。
ありがとう
答え1
あなたの例や試みが間違っています。
とにかく、私があなたのサンプルファイルを使用すると、あなたのスクリプトは次のようになります。
while read -r line; do
sed -n "/CREATE TABLE <SCHEMA_NAME>.$line/,/;/p" CREATE_DDLs.txt ;
done < List_File.txt
行末のアンカーとして使用されるように、すべてのレコードとACASE
一致しますACASE01
。$
while read -r line; do
sed -n "/CREATE TABLE <SCHEMA_NAME>.$line$/,/;/p" CREATE_DDLs.txt ;
done < List_File.txt
つまり、長いテーブルリストの場合、ファイル全体を繰り返し検索することはあまり効率的ではありませんが、拡張正規表現を使用すると次のようなものを検索できるため、最初のファイルを正しい形式に(ACASE|ABC|ABCH)
入れて検索パターンに使用します。
TABLES=$(cat List_File.txt|tr '\n' '|')
sed -nE "/CREATE TABLE <SCHEMA_NAME>.(${TABLES%|})$/,/;/p" CREATE_DDLs.txt
tr
すべての改行は「or」列に変わり、変数拡張の末尾の%|
列は削除されます。
答え2
GNU awkで「*短絡モード」を使用して同様の操作を実行できます。
gawk '
NR==FNR{tbl["CREATE TABLE <SCHEMA_NAME>." $1]; next} ($1 in tbl){ORS=RT; print}
' List_File.txt RS= FS='\n' CREATE_DDLS.txt
CREATE TABLE <SCHEMA_NAME>.ACASE
(
COLUMN1,
COLUMN2,
COLUMN3
) ;
CREATE TABLE <SCHEMA_NAME>.ABC
(
COLUMN1,
COLUMN2,
COLUMN3
) ;
アクセス権がないことを除いて、デフォルトではすべてのawkで同じことができるため、固定項目を設定する必要がありますRT
。ORS
\n\n