
여기 장면이 있습니다
테이블 이름(10개의 테이블이 있다고 가정)이 포함된 목록 파일과 생성된 모든 DDL 중 약 100개가 포함된 또 다른 파일이 있습니다.
두 번째 파일에서 첫 번째 파일에 있는 테이블의 생성 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이 있습니다. 다음 명령은 세 개의 테이블을 모두 복사하며 출력에 DDL을 생성하려면 ACASE가 필요합니다.
시나리오 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
) ;
액세스 권한이 없다는 점을 제외하면 기본적으로 모든 awk에서 동일한 작업을 수행할 수 있으므로 고정된 항목을 RT
설정해야 합니다 .ORS
\n\n