به کدام طریقه میتوانم یک فایل را به محدودههایی از سطرها، مانند سطرهای 1-10، 11-20، 21-30 تجزیه کنم؟
برخی سیستمهای یونیکس برنامه سودمند 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)