sed または awk コマンドを使用して複雑なシナリオのいずれかを実装するのに役立つ人はいますか?

sed または awk コマンドを使用して複雑なシナリオのいずれかを実装するのに役立つ人はいますか?

ここにシーンがあります

テーブル名(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で同じことができるため、固定項目を設定する必要がありますRTORS\n\n

関連情報