برخی سیستمهای یونیکس برنامه سودمند split را برای این منظور فراهم میکنند:
split --lines 10 --numeric-suffixes input.txt output-
برای انعطاف پذیری بیشتر میتوانید از sed استفاده کنید. فرمان sed میتواند به طور مثال سطرهای محدوده 1-10 را چاپ نماید
sed -n -e '1,10p' -e '10q'
این(-n) مانع چاپ کردن هر سطر توسط sed میشود. در عوض فقط سطرهای محدوده 1 تا 10 پردازش میشوند("1,10")، و آنها چاپ ("p") میشوند. فرمان پس از خواندن سطر 10 خارج("10q") میگردد.
همچنین میتوانیم این کد را برای چاپ یک محدوده انتخابی فایل(تعیین شده با شماره سطر) به کار ببریم:
# POSIX shell file=/etc/passwd range=10 cur=1 last=$(wc -l < "$file") # تعداد سطرها را میشمارد chunk=1 while [ $cur -lt $last ] do endofchunk=$(($cur + $range - 1)) sed -n -e "$cur,${endofchunk}p" -e "${endofchunk}q" "$file" > chunk.$(printf %04d $chunk) chunk=$(($chunk + 1)) cur=$(($cur + $range)) done
مثال قبل محاسبات POSIX را به کار میبرد، که شلهای Bourne قدیمیتر ندارند. در آن موقعیت، مثال زیر میتواند به جای آن به کار برود:
# printf و فرض بر عدم وجود Bourne میراث پوسته file=/etc/passwd range=10 cur=1 last=`wc -l < "$file"` # تعداد سطرها را میشمارد chunk=1 while test $cur -lt $last do endofchunk=`expr $cur + $range - 1` sed -n -e "$cur,${endofchunk}p" -e "${endofchunk}q" "$file" > chunk.$chunk chunk=`expr $chunk + 1` cur=`expr $cur + $range` done
Awk نیز میتواند برای تولید نتیجه کم و بیش مشابهی به کار برود:
awk -v range=10 '{print > FILENAME "." (int((NR -1)/ range)+1)}' file
پرسش و پاسخ 19 (آخرین ویرایش 2009-12-30 17:16:43 توسط MatthiasPopp)