원하는 문자열을 기준으로 파일 분할

원하는 문자열을 기준으로 파일 분할

다음 내용이 포함된 테스트 파일이 있습니다.

CREATE TABLE XYZ (
ABC INT,
CDE CHAR(10),
.
.
.
);
Similarly, REPLACE VIEW XYZ (
ABC,
CDE,
EFG
);
CREATE TABLE XYZ_1 (
ABC INT,
CDE CHAR(10),
.
.
.
);
Similarly, REPLACE VIEW XYZ (
ABC,
CDE,
EFG
);

이제 이 테스트 단일 파일을 2개의 파일로 분할하고 싶습니다. 한 파일에는 ill as CREATE문이 포함되어 있고 다른 파일에는 til 문이 포함되어 있습니다 .;file1file2REPLACE;

이것을 분할하는 방법을 알려 주실 수 있나요?

답변1

방법은 다음과 같습니다 sed.

sed -n 'H                      # append every line to hold buffer
/CREATE\|REPLACE/h             # if CREATE or REPLACE, overwrite hold buffer
/;/{                           # if line matches ; then
x                              # exchange hold space w. pattern space
/CREATE/w file1                # if pattern space matches CREATE, write to file1
/REPLACE/w file2               # if it matches REPLACE, write it to file2
}
' infile

답변2

다음 awk스크립트를 사용해 보세요.

/CREATE/{
b="";
    while (match($0, ";$")==0)
    {
        b=b $0"\n";
        getline;

    }
    b=b $0;
    print b > "file1";
}

/REPLACE/{
c="";
    while (match($0, ";$")==0)
    {
        c=c $0"\n";
        getline;

    }
    c=c $0;
    print c > "file2";
}

그래서

awk -f some.awk inputFile

생산하다:

고양이 파일 1
CREATE TABLE XYZ (
ABC INT,
CDE CHAR(10),
.
.
.
);
CREATE TABLE XYZ_1 (
ABC INT,
CDE CHAR(10),
.
.
.
);

그리고

고양이 파일 2
Similarly, REPLACE VIEW XYZ (
ABC,
CDE,
EFG
);
Similarly, REPLACE VIEW XYZ (
ABC,
CDE,
EFG
);

답변3

sed -e '/CREATE/,/;/s/^//w file1' -e//d <infile >file2

...그냥 범위를 무효화할 뿐입니다. 모든 행을 씁니다.CREATE ... ;범위는 file1이고 다른 모든 범위는 file2입니다.

더 간단하게 말하면 다음과 같습니다.

sed -ne '/CREATE/,/;/w file1' -e '/REPLACE/,/;/w file2' <infile

...실제 입력이 예제 데이터만큼 간단하지 않은 경우 중복될 수 있습니다.

그러나 샘플 데이터를 사용하여 두 명령 중 하나를 실행하고 다음을 수행할 수 있습니다.

head -n50 file[12]

...다음과 같은 출력이 생성됩니다.

==> file1 <==
CREATE TABLE XYZ (
ABC INT,
CDE CHAR(10),
.
.
.
);
CREATE TABLE XYZ_1 (
ABC INT,
CDE CHAR(10),
.
.
.
);

==> file2 <==
Similarly, REPLACE VIEW XYZ (
ABC,
CDE,
EFG
);
Similarly, REPLACE VIEW XYZ (
ABC,
CDE,
EFG
);

관련 정보