패턴에 따라 큰 파일을 작은 부분으로 분할하기 위한 이전 답변에서 다음 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
다음 결과를 분할합니다 .sed
awk
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
이전 버퍼와 일치하지 않는 모든 줄을 추가하고, 마지막 줄이 아니면 삭제하고, 일치하는 줄에 포함되지 않은 경우 버퍼를 변경합니다. 패턴 공간. 그런 다음 결과는 으로 파이프됩니다. 오류가 발생하면 다음 파일을 사용해야 합니다.ID
H
x
ID
some_method
awk
too many open files
close()
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
사용할 수 있습니다 .csplit
awk
sed '1{h;d};/ID/!{H;$!d};x;/some_method/!d' infile | \
csplit -f 'part-' -b '%03d.txt' -sz - /ID/ '{*}'