sed 또는 awk 명령을 사용하여 다소 복잡한 시나리오 중 하나를 구현하는 데 도움을 줄 수 있는 사람이 있습니까?

sed 또는 awk 명령을 사용하여 다소 복잡한 시나리오 중 하나를 구현하는 데 도움을 줄 수 있는 사람이 있습니까?

여기 장면이 있습니다

테이블 이름(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

관련 정보