پرسش و پاسخ شماره ۱۹ - آموزش اسکریپت نویسی

آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

#!/bin/bash

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

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

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