انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید

نویسنده موضوع: کامند نویسی پیشرفته در لینوکس  (دفعات بازدید: 1008 بار)

0 کاربر و 3 مهمان درحال مشاهده موضوع.

آفلاین zahra.shl

  • Newbie
  • *
  • ارسال: 14
کامند نویسی پیشرفته در لینوکس
« : 23 تیر 1399، 10:11 ق‌ظ »
سلام دوستان
من یک سوال کامند نویسی در منحیط لینوکس داشتم. دوستان من یک فایل به صورت تکست دارم و می خواهم اولین عدد هر پاراگراف را مقایسه کند و اگر برابر باشند آن ها را در یک پاراگراف چاپ کند . در غیر این صورت آن ها را در پاراگراف متفاوت چاپ کند. چطوری میتونم در لینوکس این کار را انجام بدهم؟
متشکرم

آفلاین gnkalk

  • Full Member
  • *
  • ارسال: 188
  • linux the kernl - gnu/linux the OS
پاسخ : کامند نویسی پیشرفته در لینوکس
« پاسخ #1 : 23 تیر 1399، 10:49 ق‌ظ »
سلام دوستان
من یک سوال کامند نویسی در منحیط لینوکس داشتم. دوستان من یک فایل به صورت تکست دارم و می خواهم اولین عدد هر پاراگراف را مقایسه کند و اگر برابر باشند آن ها را در یک پاراگراف چاپ کند . در غیر این صورت آن ها را در پاراگراف متفاوت چاپ کند. چطوری میتونم در لینوکس این کار را انجام بدهم؟
متشکرم
فکر نکنم چنین قابلیتی رو کد های شل داشته باشن باید از زبان های برنامه نویسی استفاده کنید

آفلاین M!lad

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1757
پاسخ : کامند نویسی پیشرفته در لینوکس
« پاسخ #2 : 23 تیر 1399، 11:02 ق‌ظ »
سوالتون شبیه یک تمرین هست. برای اینکه بتونیم راهنماییتون کنیم بهتر هست یک ورودی و خروجی نمونه قرار بدید.

به نظر میاد باید با ابزاری مثل awk این کار رو انجام بدید.
..I feel no fault for the fault I feel..

آفلاین zahra.shl

  • Newbie
  • *
  • ارسال: 14
پاسخ : کامند نویسی پیشرفته در لینوکس
« پاسخ #3 : 23 تیر 1399، 12:51 ب‌ظ »
ممنون از پاسخ گوپپتان ورودی من فایلی مثل فایل زیر هست
ورودی من
a 1
1 b
1 d
2 c
2 e

خروجی که میخام
1 a b d
2 c e


آفلاین alend

  • High Hero Member
  • *
  • ارسال: 1319
پاسخ : کامند نویسی پیشرفته در لینوکس
« پاسخ #4 : 23 تیر 1399، 01:52 ب‌ظ »
احتمالا با awk می شود ولی اینجا من با دستور R این مسئله رو حل کردم.



A = data.frame(C1=c("a","b","d","c","e"),C2=c(1,1,1,2,2))
write.table(tapply(A$C1,A$C2,function(x)paste(x,collapse=" ")),quote=F,col.names=F)

فقط اعداد اول چاپ می شوند بعد حروف. این مشکل را می شود حل کرد ولی احتمالا نه در یک خط.
« آخرین ویرایش: 23 تیر 1399، 01:56 ب‌ظ توسط alend »

آفلاین zahra.shl

  • Newbie
  • *
  • ارسال: 14
پاسخ : کامند نویسی پیشرفته در لینوکس
« پاسخ #5 : 23 تیر 1399، 02:12 ب‌ظ »
تشکر از پاسخ گوییتان
باید با کامندای لینوکس این کار رو انجام بدم چند روزه درگیرش شدم اما متاسفانه هنوز به جوابی نرسیدم.

آفلاین alend

  • High Hero Member
  • *
  • ارسال: 1319
پاسخ : کامند نویسی پیشرفته در لینوکس
« پاسخ #6 : 23 تیر 1399، 02:55 ب‌ظ »
تشکر از پاسخ گوییتان
باید با کامندای لینوکس این کار رو انجام بدم چند روزه درگیرش شدم اما متاسفانه هنوز به جوابی نرسیدم.

تمرین دانشگاه است:)؟

آفلاین zahra.shl

  • Newbie
  • *
  • ارسال: 14
پاسخ : کامند نویسی پیشرفته در لینوکس
« پاسخ #7 : 23 تیر 1399، 03:06 ب‌ظ »
بله.

آفلاین alend

  • High Hero Member
  • *
  • ارسال: 1319
پاسخ : کامند نویسی پیشرفته در لینوکس
« پاسخ #8 : 23 تیر 1399، 03:13 ب‌ظ »
اینجا فقط می تونیم راهنماییتان کنیم نه اینکه تمرین را حل کنیم.

ولی خوب اگر نمی خواهید آر را اجرا کنید این کلک مرغابی را می تونید بزنید:

r -tpe 'A = data.frame(C1=c("a","b","d","c","e"),C2=c(1,1,1,2,2));write.table(tapply(A$C1,A$C2,function(x)paste(x,collapse=" ")),quote=F,col.names=F)'
من به دلیل بالا (آر کارم راه می اندازد و اگر نداخت سی دو مثبت استفاده می کنم) از awk به ندرت استفاده می کنم.  AWK یک زبان برنامه‌نویسی مفسری:

https://fa.wikipedia.org/wiki/AWK


که به احتمال زیاد می تواند این مشکل را حل کند.

https://www.grymoire.com/Unix/Awk.html




آفلاین M!lad

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1757
پاسخ : کامند نویسی پیشرفته در لینوکس
« پاسخ #9 : 23 تیر 1399، 03:57 ب‌ظ »
من بعید می‌دونم طراح سوال قصد داشته باشه شما با awk مسئله رو حل کنید. به همین خاطر من پاسخ رو با awk براتون می‌نویسم ولی بهتر هست با حلقه و آرایه خودتون مسئله رو حل کنید. ایکاش توضیح میدادید تا الان چه کار کردید و به چه نتایجی رسیدید!


فرض کنید داده‌ها درهم ریخته باشند:

$ cat file
a 1
b 2
c 3
d 2
e 2
f 1
g 3

می‌تونیم با ترکیب sort و awk مسئله رو حل کنیم. مرتب کردن داده‌های ما رو به این شکل در میاره:

$ sort --numeric-sort -k 2 file
a 1
f 1
b 2
d 2
e 2
c 3
g 3

$ sort --numeric-sort -k 2 file | awk 'NR>1 && $2!=ll { printf ll; print "" }{ ll=$2 } {printf $1" "} END {printf ll}'
خروجی:

a f 1
b d e 2
c g 3

قسمت awk رو از لینک دومی که alend قرار داد خودتون کمی مطالعه کنید تا متوجه بشید چه اتفاقی داره رخ می‌ده!
..I feel no fault for the fault I feel..

آفلاین moheb2000

  • Sr. Member
  • *
  • ارسال: 297
  • جنسیت : پسر
  • Hello, World
    • mebrahimi.ir
پاسخ : کامند نویسی پیشرفته در لینوکس
« پاسخ #10 : 23 تیر 1399، 05:07 ب‌ظ »
#!/bin/bash

numberOfLines=`wc -l $1 | tr -dc '0-9'`
# this loop create two arrays for numbers and characters
for (( i=0; i<$numberOfLines; i=i+1 )); do
    declare -a numberList
    numberList+=(`head -n $(( i+1 )) $1 | tail -1 | tr -dc '0-9'`)
    declare -a characterList
    characterList+=(`head -n $(( i+1 )) $1 | tail -1 | tr -dc 'a-z'`)
done
uniqueNumberList=($(echo "${numberList[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' ')) # this create an array from unique numbers in lines
create_line(){
# this loop create a list from index of a unique number in numberList
    for i in "${!numberList[@]}"; do
        if [[ "${numberList[$i]}" -eq $1 ]]; then
            declare -a myList
            myList+=(${i});
        fi
    done
# this loop create a line contain characters
    generatedLine=""
    for j in "${myList[@]}"; do
        generatedLine+="${characterList[$j]} "
    done
}
# this loop create output value
for k in "${uniqueNumberList[@]}"; do
create_line $k
echo "$generatedLine$k"
done
کد بالا را در یک فایل به نام exam.sh ذخیره کنید و مجوز اجرا به اون بدید
chmod 755 exam.sh
برای اجرا هم از کامند زیر استفاده کنید:
./exam.sh filename
به جای filename اسم فایل مدنظر رو قرار بدید
...
ببخشید شاید یه مقدار موضوعو پیچیده کردم ولی اینم یه راه حل جالب بود که به ذهنم رسید :)
« آخرین ویرایش: 23 تیر 1399، 05:10 ب‌ظ توسط moheb2000 »

آفلاین alend

  • High Hero Member
  • *
  • ارسال: 1319
پاسخ : کامند نویسی پیشرفته در لینوکس
« پاسخ #11 : 24 تیر 1399، 03:11 ق‌ظ »
#!/bin/bash

numberOfLines=`wc -l $1 | tr -dc '0-9'`
# this loop create two arrays for numbers and characters
for (( i=0; i<$numberOfLines; i=i+1 )); do
    declare -a numberList
    numberList+=(`head -n $(( i+1 )) $1 | tail -1 | tr -dc '0-9'`)
    declare -a characterList
    characterList+=(`head -n $(( i+1 )) $1 | tail -1 | tr -dc 'a-z'`)
done
uniqueNumberList=($(echo "${numberList[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' ')) # this create an array from unique numbers in lines
create_line(){
# this loop create a list from index of a unique number in numberList
    for i in "${!numberList[@]}"; do
        if [[ "${numberList[$i]}" -eq $1 ]]; then
            declare -a myList
            myList+=(${i});
        fi
    done
# this loop create a line contain characters
    generatedLine=""
    for j in "${myList[@]}"; do
        generatedLine+="${characterList[$j]} "
    done
}
# this loop create output value
for k in "${uniqueNumberList[@]}"; do
create_line $k
echo "$generatedLine$k"
done
کد بالا را در یک فایل به نام exam.sh ذخیره کنید و مجوز اجرا به اون بدید
chmod 755 exam.sh
برای اجرا هم از کامند زیر استفاده کنید:
./exam.sh filename
به جای filename اسم فایل مدنظر رو قرار بدید
...
ببخشید شاید یه مقدار موضوعو پیچیده کردم ولی اینم یه راه حل جالب بود که به ذهنم رسید :)

من نمی دونم چرا وقتی اسکریپت های بش مثل این را می بینم فکر می کنم سی دو مثبت از بش ساده تر است  ;D.