수천 개의 분자 좌표가 포함된 파일이 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.* 번들이 보관됩니다.