다음 샘플 텍스트가 포함된 파일이 있습니다.
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
file1
heredoc 에서 제공하는 첫 번째 줄을 사용하십시오 .ed
ed -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);