
나는 대략 비슷한 파일을 가지고 있습니다
header_one
param1
param2
...
data_one
data1
data2
data3
data4
...
header_two
param1
param2
...
data_two
data1
data2
data3
data4
header
다음 줄이 있는 모든 블록 과 다음 줄이 있는 모든 블록을 추출하여 파일에 나타나는 순서를 유지하고 다른 모든 블록을 삭제하고 싶습니다 .N
data
M != 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