انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: triumph در 25 دی 1392، 08:57 قظ
-
سلام...اگر بخوایم خروجی wc رو با هم جمع کنیم چه طور ممکنه؟
wc -l 100/result_range 104/result_range
خروجی فرمان هست:
42 100/result_range
8 104/result_range
50 total
میدونم ادامه اون باید از پایپ و دستور cut -f -d استفاده بشه..ولی هر چی سعی میکنم خروجی من رو نمیده...ممکنه خط ها بین ۱ تا ۱۰۰۰ باشن..برایهمین من میخوام جمع همه خطها در نهایت حساب بشه
به طور واضح اگر بخوام بگم خروجی اسکریپت من چیزی شبیه به این هست و من میخوام این اعداد باهم جمع بشن:
3387 /test/file
23619 /test/file
5813 /test/file
10190 /test/file
1282 /test/file
42 /test/file
8 /test/file
138 /test/file
-
گیریم برآیند ( خروجی ) را در پرونده ای به نام temp.txt ریخته ایم :
cat temp.txt | cut -d' ' -f1 | sed ':a;N;$!ba;s/\n/+/g' | bc
-
پرسش شما مشمول این مطلب http://bashguide.blogsky.com/pages/XyProblem (http://bashguide.blogsky.com/pages/XyProblem)می شود. اگر شما حاصل جمع خروجی فرمان wc را میخواهید همانطور که در کد خروجی فرمان درج شده شما نیز دیده میشود wc خودش آن را با عنوان total به شما میدهد و نیازی به کار اضافه ندارد. به هر حال اگر خروجی نمونه خود را به یک فایل مثلا az هدایت کنید آنوقت
var1=($(cat az |cut -d' ' -f1))
اعداد مورد نظر را در یک آرایه به نام var1 قرار میدهد. کهحتماً میتوانید عناصر آرایه را با تشکیل یک حلقه با یکدیگر جمع کرده در متغیر مورد نظر قرار بدهید. مانند:
sum=$((${var1[0]}+${var1[1]}))
برای عضو اول و دوم.
توضیح برای کسانی که شاید ندانند: در سطر اول پرانتزهای بیرونی برای تعیین var1 به عنوان آرایه است. cat از طرق لوله خروجیاش را به برنامه cut میدهد که برای این برنامه دوگزینه تعیین کردهایم، اولی یعنی از محل فاصله و دومی یعنی فیلد اول را برش بدهد. و نتیجه به خاطر استفاده از ترکیب $() بعد از علامت مساوی یعنی به جای عناصر آرایه جایگزین میشوند.
-
این جور مساله ها رو بیشتر با awk حل می کنن .
awk '{s+=$1;print}END{print s " = total"}' filename
یا اگه بخوایم با یک shell script حل کنیم :
s=0
for i in `sed 's/ .*//' filename`
do
s=`expr $s + $i`
done
echo $s
واضحه که با awk خیلی راحتتره.