منبع اصلی نوشتار زیر در این لینک قرار دارد

پرسش و پاسخ شماره ۱۹


پرسش و پاسخ‌های رایج Bash  در Greg\'s Wiki

پرسش و پاسخ شماره ۱۹

به کدام طریقه می‌توانم یک فایل را به محدوده‌هایی از سطرها، مانند سطرهای 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


CategoryShell

پرسش و پاسخ 19 (آخرین ویرایش ‎ 2009-12-30 17:16:43 ‎ توسط MatthiasPopp)