패턴별로 파일을 분할하고 두 번째 패턴이 포함된 조각만 유지합니다.

패턴별로 파일을 분할하고 두 번째 패턴이 포함된 조각만 유지합니다.

패턴에 따라 큰 파일을 작은 부분으로 분할하기 위한 이전 답변에서 다음 awk 스크립트를 찾았습니다("헤더 행"을 다른 패턴으로 교체). 그러나 잠재적으로 수백만 개의 부품이 생성될 수 있으므로 한 단계 더 나아갈 필요가 있지만 각 부품을 다시 필터링할 수 있다면 필요한 것을 얻을 수 있을 것입니다.

awk '
    /header-line/ {++part}
    {print >sprintf("part-%03d.txt", part)}
'

각 "섹션"을 작성하기 전이나 후에 질문하여 해당 섹션에 특정 패턴이 있는지 확인하고, 추가된 패턴과 일치하는 경우에만 해당 섹션을 작성하는 것이 가능합니까?

예를 들어 초기 조건은 "ID:"(위의 헤더 행)입니다. 그런 다음 특정 메서드 이름에 대해 생성된 모든 "부분"을 검색하려고 합니다. 검색할 문자열로 "searchForThisMethod"를 호출합니다. 이 문자열은 부분 내의 다양한 위치에 있을 수 있습니다.

입력 예:

ID: 1
bb
bb
bb
bb
secondaryCheck
ID: 2
b
b
b
b
b
b
b
b
ID: 3
h
h
h
h
h
secondaryCheck
g
g
g
g

답변1

파일을 분할한 다음 grep -q some_method각 부분에서 실행하고 다음과 같은 경우 삭제할 수 있습니다.잘못된예를 들어

for file in part-*.txt; do
grep -q some_method "$file"
  if [ $? -ne 0 ]
    then
      rm "$file"
  fi
done

또는 두 개의 패스를 사용합니다. 첫 번째와 두 번째 패스에 대한 다음 코드와 같이
입력에서 포함된 "부분"을 제거한 some_method다음 결과를 분할합니다 .sedawk

sed -e '1{h;d;}' -e '/ID/!{H;$!d;}' -e 'x;/some_method/!d' infile | \
awk '/ID/{++part}{print > sprintf("part-%03d.txt", part)}'

sed첫 번째 줄을 h이전 버퍼에 복사하고 삭제한 다음 d이전 버퍼와 일치하지 않는 모든 줄을 추가하고, 마지막 줄이 아니면 삭제하고, 일치하는 줄에 포함되지 않은 경우 버퍼를 변경합니다. 패턴 공간. 그런 다음 결과는 으로 파이프됩니다. 오류가 발생하면 다음 파일을 사용해야 합니다.IDHxIDsome_methodawktoo many open filesclose()

sed -e '1{h;d;}' -e '/ID/!{H;$!d;}' -e 'x;/some_method/!d' infile | \
awk '/ID/{++part}{close(fn);fn=sprintf("part-%03d.txt", part);print >> fn}'

또는 /anything을 사용 중이라면 다음을 대신 gnu사용할 수 있습니다 .csplitawk

sed '1{h;d};/ID/!{H;$!d};x;/some_method/!d' infile | \
csplit -f 'part-' -b '%03d.txt' -sz - /ID/ '{*}'

관련 정보