パターンがN回表示された後にファイルを複数のファイルに分割するには?

パターンがN回表示された後にファイルを複数のファイルに分割するには?

何千もの分子座標を含むファイルがLinuxにあります。各分子は常に同じパターンを含む線で始まります。

@<TRIPOS>MOLECULE

その後、別の行に進みます。ファイルを複数のファイルに分割したいです。各ファイルには特定の数の分子が含まれています。これを行う最も簡単な方法は何ですか?

答え1

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.* バンドルが保存されます。

関連情報