아래와 같은 파일이 있습니다.
Line1
line2
Begin1
Select is running
Done1
Begin
Update is in progress
Done
Begin2
Select is running
Done2
Begin3
select is running
Done4
line last
업데이트라는 단어를 찾아 시작(이전 줄)부터 시작하여 완료(다음 줄)까지 블록을 제거하고 싶습니다.
따라서 최종 출력은 다음과 같습니다.
Line1
Line2
Begin1
Select is running
Done1
Begin2
Select is running
Done2
Begin3
select is running
Done4
line last
삭제하려면 다음 코드를 사용하지만 불행하게도 Being 및 Done 문자열이 없는 모든 행을 삭제합니다.
awk -i inplace '/BEGIN/ {f=1} f {s=s?s"\n"$0:$0;if ($0~/update/) f=s=0} /COMMIT/ && f {print s;f=s=0}' filename
Begin1
Select is running
Done1
Begin2
Select is running
Done2
Begin3
select is running
Done4
고쳐 쓰다:
또 다른 사용 사례:
다른 파일의 구조가 다음과 같은 경우
Line1
line2
Begin
Select is running
Done
Begin
Done
Update is in progress
Begin2
Select is running
Done2
Begin3
select is running
Done4
line last
여기 Begin
와 Done
전에 update
. 그래서 저는 그 세 줄을 삭제하고 싶습니다. 이를 달성하기 위해 권장되는 방법이 있습니까?
답변1
예를 들어 이 awk 스크립트를 다음과 같이 저장합니다 717212.awk
.
BEGIN { p=1 }
/^Update/ { p=0 }
p { print $0 }
p==0 && /^Done/ { p=1 }
그러면 주어진 입력 파일에 대한 요청이 수행됩니다 inputfile
.
awk -f 717212.awk inputfile
작동 방식은 원하는 것을 정확하게 나열하는 것입니다. 특정 조건에 따라 인쇄하고 싶기 때문에 인쇄할지 여부를 추적하는 BEGIN
변수를 ning에 정의합니다 .p
^
( )로 시작하는 줄이 보이면 인쇄를 원하지 않는다는 뜻으로 로Update
설정한 것p
입니다 .0
- 그런 다음 true(즉, 0이 아닌 경우)
print
인 경우에만 행을 입력합니다 .p
- 마지막으로, 로 시작하고 현재 인쇄 중이 아닌 줄이 보이면
Done
(즉,p
과 같은 경우) 인쇄를 다시 시작하도록0
설정합니다 .p
여기서 가장 큰 차이점은 인쇄만 수행된다는 것입니다.뒤쪽에인쇄를 계속할지 여부를 결정했지만 다음 줄에서 인쇄를 재개할지 여부를 확인하기 전에는 결정하지 않았습니다.