파일에서 여러 섹션/라인을 분리하세요.

파일에서 여러 섹션/라인을 분리하세요.

다음 샘플 텍스트가 포함된 파일이 있습니다.

THIS(
is first
Line);
THAT(
is second line);
THIS(
is third
line);
THAT(
is 
fourth
line);

파일을 보면 각 섹션은 "THIS" 또는 "THAT"으로 시작하고 각 텍스트 섹션은 세미콜론( )으로 끝납니다 ;. 나는 "THIS"와 "THAT"을 검색하고 모든 "THIS" 부분을 하나의 파일에 복사 first_file하고 모든 "THAT" 부분을 다른 파일에 복사 하는 Unix 명령/스크립트를 원합니다 second_file.

예: 첫 번째 파일에는 다음이 포함되어야 합니다.

THIS(
is first
Line);
THIS(
is third
line);

두 번째 파일에는 다음이 포함되어야 합니다.

THAT(
is second line);
THAT(
is 
fourth
line);

답변1

주어진

$ cat thisthat 
THIS(
is first
Line);
THAT(
is second line);
THIS(
is third
line);
THAT(
is 
fourth
line);

그 다음에

awk -vRS=';\n' 'BEGIN{ORS=RS} /^THIS/ {print > "these"} /^THAT/ {print > "those"}' thisthat

결과

$ head these those 
==> these <==
THIS(
is first
Line);
THIS(
is third
line);

==> those <==
THAT(
is second line);
THAT(
is 
fourth
line);

답변2

어떤 이상한 경우 :

$ awk -v RS=';' 'NF{sub(/^\n/,""); print > (/^THIS/ ? "first_file" : "second_file")}' file

$ cat first_file
THIS(
is first
Line)
THIS(
is third
line)

$ cat second_file
THAT(
is second line)
THAT(
is
fourth
line)

또는 GNU awk를 사용하여 다중 문자 RS 및 RT를 구현합니다.

$ awk -v RS='(THIS|THAT)[^;]+;\n' -v ORS= '{$0=RT; print > (/^THIS/ ? "first_file" : "second_file")}' file

$ cat first_file
THIS(
is first
Line);
THIS(
is third
line);

$ cat second_file
THAT(
is second line);
THAT(
is
fourth
line);

두 솔루션 모두 예제가 정확하고 ;블록 끝(예: 부품 내부가 아님)을 제외하고 (...)는 s가 없다고 가정합니다.

답변3

ed파일 편집기를 사용 하되 먼저 두 번째(빈) 파일을 만듭니다. file1이 예에서는 원본 파일의 이름이 지정됩니다.

라는 이름의 두 번째 파일을 만듭니다.file2

> file2

정리

ed -s file1 << 'EOF'
H
g/^THAT($/;/^.*\;$/d
w
u
g/^THIS($/;/^.*\;$/d
0r file2
w file2
EOF

file1heredoc 에서 제공하는 첫 번째 줄을 사용하십시오 .eded -s file1 << 'EOF'

두 번째 줄은 오류에 유용한 더 자세한 메시지를 인쇄합니다.H

세 번째 줄은 THAT(로 시작하는 줄을 ;로 끝나는 줄까지 삭제합니다.

g/^THAT($/;/^.*\;$/d

네 번째 줄은 변경 사항을 file1에 씁니다.w

다섯 번째 줄은 file1이 아닌 버퍼의 변경 사항만 취소합니다.u

여섯 번째 줄은 THIS(로 시작하는 줄을 ;로 끝나는 줄까지 삭제합니다.

g/^THIS($/;/^.*\;$/d

7행에서는 버퍼에 남아 있는 텍스트를 file2의 시작 부분에 추가합니다.

0r file2

파일 2를 변경하기 위해 8줄이 기록됩니다.w file2


유일한 라이너.

>file2; printf '%s\n' H 'g/^THAT($/;/^.*\;$/d' w u 'g/^THIS($/;/^.*\;$/d' '0r file2' 'w file2' | ed -s file1

ed파일을 편집한다는 것은 in-place파일이 직접 편집되고 출력이 다른 곳에 인쇄되지 않는다는 것을 의미하므로 ed프로덕션 파일에서 실행하기 전에 먼저 몇 가지 예제를 사용하여 이를 테스트하십시오.

답변4

Awk 플래그 방법을 사용해 보세요

awk '/THIS/{f=1}/THAT/{f=0}f' file > file1(Contains "THIS" PATTERN)
awk '/THAT/{f=1}/THIS/{f=0}f' file > file2(Contains "THAT" PATTERN)

산출

cat file1

THIS(
is first
Line);
THIS(
is third
line);



cat file2

    THAT(
    is second line);
    THAT(
    is 
    fourth
    line);

관련 정보