Text-Processing
出現N個模式後如何將文件拆分為多個文件?
我在 Linux 上有一個文件,其中包含數千個分子的座標。每個分子都以包含始終相同模式的行開頭:
@<TRIPOS>MOLECULE
然後繼續其他行。我想將文件分成多個文件,每個文件都包含一定數量的分子。最簡單的方法是什麼?
一種方法是使用
awk
:awk -v moleculesNum=7 ' /^@<TRIPOS>MOLECULE/{ if((++num)%moleculesNum==1){ close(outfile); outfile="file" (++Output) } } { print >outfile }' infile
這會將原始文件拆分為多個文件,每個文件最多包含 7 個 MOLECULE(可在
moleculesNum=7
參數中調整)
以下是一個
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.* 束。