다양한 컨텍스트로 여러 패턴을 grep

다양한 컨텍스트로 여러 패턴을 grep

나는 대략 비슷한 파일을 가지고 있습니다

header_one
param1
param2
...

data_one
data1
data2
data3
data4
...

header_two
param1
param2
...

data_two
data1
data2
data3
data4

header다음 줄이 있는 모든 블록 과 다음 줄이 있는 모든 블록을 추출하여 파일에 나타나는 순서를 유지하고 다른 모든 블록을 삭제하고 싶습니다 .NdataM != N

M == N == 8내가 이걸 할 수 있다면

grep -A8 -E "header_|data_"

하지만 각 패턴에 대해 서로 다른 컨텍스트를 제공하려면 어떻게 해야 할까요?

답변1

awk를 사용하는 임시 솔루션은 다음과 같습니다.

awk '/^header_/ {n=1+1} /^data_/ {n=1+2} n-- > 0; n == 0 {print "---"}' < file

n일치하는 행에 대해 설정되고 각 행에 대해 감소됩니다. 양수 이면 n각 블록 뒤에 구분 기호가 추가된 행이 인쇄됩니다. 위의 값을 사용하면 header_한 줄에 다음 줄을 더하고, data_한 줄에 다음 줄을 두 줄씩 인쇄합니다 .


컨텍스트 블록이 겹칠 수 있는 경우 새 값이 n이전 값을 덮어씁니다. 이를 방지하려면 할당을 보호하는 조건을 추가하세요.

awk '/^header_/ {if (n < 2) n=2} 
     /^data_/   {if (n < 5) n=5}
     n-- > 0; n == 0 {print "---"}' < file

이는 data_연속된 행에 합계가 존재하는 경우를 더 잘 처리해야 합니다.header_

답변2

아래 sed 명령을 사용해 보았고 잘 작동하는지 테스트했습니다. 혼란스러운 점이 있으면 알려주십시오.

sed -n -e  '/header_/,+1p' -e '/^data_/,+2p' filename

산출

header_one
param1
data_one
data1
data2
header_two
param1
data_two
data1
data2

관련 정보