아래는 시나리오입니다
테이블 이름이 포함된 목록 파일이 하나 있고 테이블이 10개 있다고 가정하고 모든 생성 DDL이 약 100개 있는 또 다른 파일이 있습니다.
첫 번째 파일에 존재하는 테이블에 대해 두 번째 파일에서 create DDLS를 추출해야 합니다. 나는 명령을 사용하여 이것을 달성했습니다 sed
. 그러나 내 명령이 몇 개의 테이블과 첫 번째 파일에 없는 일부 추가 테이블에 대해 두 번 복사되는 문제가 발생했습니다.
예를 들어;
내 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는 목록 파일에 존재하고 두 번째 파일에는 ACASE/ACASE01/ACASE03이 있습니다. 아래 명령은 ACASE create DDL만 필요한 세 테이블을 모두 출력에 복사합니다.
시나리오 2:
ABC & ABCD가 목록 파일에 존재하며 명령은 하나의 ABCD만 필요한 ABCD 테이블을 두 번 출력합니다.
아래는 내가 실행하는 명령입니다
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
) ;
액세스할 수 없으므로 다음 과 같이 고정된 항목으로 RT
설정해야 한다는 점을 제외하면 모든 awk에서 기본적으로 동일한 작업을 수행할 수 있습니다.ORS
\n\n