패턴이 N번 나타난 후 파일을 여러 파일로 분할하는 방법은 무엇입니까?

패턴이 N번 나타난 후 파일을 여러 파일로 분할하는 방법은 무엇입니까?

수천 개의 분자 좌표가 포함된 파일이 Linux에 있습니다. 각 분자는 항상 동일한 패턴을 포함하는 선으로 시작합니다.

@<TRIPOS>MOLECULE

그런 다음 다른 라인을 계속 진행하세요. 파일을 여러 파일로 분할하고 싶습니다. 각 파일에는 특정 수의 분자가 포함되어 있습니다. 이를 수행하는 가장 쉬운 방법은 무엇입니까?

답변1

한 가지 방법은 다음을 사용하는 것입니다 awk.

awk -v moleculesNum=7 '
/^@<TRIPOS>MOLECULE/{
    if((++num)%moleculesNum==1){
        close(outfile); outfile="file" (++Output)
    }
}
{ print >outfile }' infile

이렇게 하면 원본 파일이 각각 최대 7개의 분자가 포함된 여러 파일로 분할됩니다( moleculesNum=7매개변수에서 조정 가능).

답변2

다음은 다음을 bash기반으로 하는 csplit유틸리티 방법 입니다.

### user customization section
tmpdir=$(mktemp -d)
prefix='outfile'
bunch=5
pat='@<TRIPOS>MOLECULE'

## break up the input file on pattern
csplit ./file \
  --silent \
  --elide-empty-files \
  --prefix "$tmpdir/$prefix" \
  --suffix-format='%d.tmp' \
  "/$pat/+1" '{*}' \
;

## coalesce the split up files into bunches
i=0
while :; do
  start=$(( bunch * i ))
  stop=$(( start + bunch - 1 ))
  for ((j=start; j<=stop; j++)) {
    printf '%s\n' "$tmpdir/$prefix$j.tmp"
  } | xargs cat > "./$prefix.$i" 2>/dev/null || break
  (( i++ ))
done

현재 디렉토리에는 outfiles.* 번들이 보관됩니다.

관련 정보