sed 또는 awk 명령을 사용하여 중간 정도의 복잡한 시나리오 중 하나를 달성하는 데 도움을 줄 수 있는 사람이 있습니까?

sed 또는 awk 명령을 사용하여 중간 정도의 복잡한 시나리오 중 하나를 달성하는 데 도움을 줄 수 있는 사람이 있습니까?

아래는 시나리오입니다

테이블 이름이 포함된 목록 파일이 하나 있고 테이블이 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

관련 정보