그래서 다음과 같은 입력이 있습니다.
start
abcd
sfd
afsdaf
afsaf
end 1
start
sdfo
efsf
end 0
start
sdf
efsf
end 2
따라서 시작과 끝(포함) 사이의 줄만 인쇄하고 싶지만 줄의 두 번째 필드가 end
0보다 큰 경우에만 인쇄하고 싶습니다(따라서 start
and end 1
, start
and 사이, and 사이 end 2
는 아님 ). 내가 할 수 있는 방법이 있나요?start
end 0
답변1
$ awk -v RS= -v ORS='\n\n' '$NF' file
start
abcd
sfd
afsdaf
afsaf
end 1
start
sdf
efsf
end 2
귀하의 레코드는 빈 줄로 구분되어 있고 모두 "start"로 시작하고 "end"로 끝나기 때문에 "start"로 시작하고 "end"로 끝난다는 사실은 부적합합니다. 우리가 고려해야 할 점은 위에 표시된 것처럼 각 빈 줄로 구분된 단락의 마지막 공백으로 구분된 필드가 0이 아니라는 것입니다. If RS is null
에서 찾고https://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.htmlRS=
무엇을 해야할지 모르는 경우 .
답변2
awk '
/start/ { toprint=$0 ; save=1; next }
save { toprint = toprint "\n" $0 ; }
/end/ {if (($2> 0) && save) { print toprint ;} save=0 }'
"시작" 줄이 보이면 저장을 시작하세요. 저장하려면 인쇄할 내용에 데이터를 추가하세요. "끝" 줄이 보이면 저장 중이고 두 번째 필드가 0보다 큰 경우 현재 있는 내용을 인쇄한 다음 저장을 중지하세요.