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

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

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


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: انتخاب سطرهای خاص با bashscript یا awk  (دفعات بازدید: 5556 بار)

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

آفلاین oostaa

  • Jr. Member
  • *
  • ارسال: 91
  • جنسیت : پسر
انتخاب سطرهای خاص با bashscript یا awk
« : 17 فروردین 1395، 04:05 ب‌ظ »
با سلام. من میخواستم با bashscript یا زبان  برنامه نویسی awk  ،الگوریتم زیر رو روی یه فایل که دارای 5 تا ستون و 500000 سطره پیاده کنم: (سطر دوم این فایل، فقط دارای مقادیر 1 یا  2 است)

1.تمام سطرهایی که ستون سوم و ستون چهارم آنها با یکدیگر مساوی اند  (ستون سوم سطرها با هم مساوی باشد و علاوه بر ستون سوم ،ستون چهارمشان هم با هم مساوی باشد) اگر در بین ستون دومشان عدد 2 داشته باشند، همه ی آن سطرهایی که ستون دومشان 1 است حذف شوند و از بین سطرهایی که ستون دومشان 2 است فقط سطری حفظ شود که ستون پنجمش بیشترین مقدار را دارد و بقیه ی سطرها حذف شوند.

2.اما اگر (در بین تمام سطرهایی که ستون سوم و ستون چهارم آنها با یکدیگر مساوی اند) در بین ستون دومشان عدد 2 نداشته باشند، فقط سطری حفظ شود که ستون پنجمش کمترین مقدار را داشته باشد.
نمونه اسکریپت:

1       2      0       0       12.325
27033   1   23517   17240   26872
87      2  19958   22037   13386
21795   1   27395   25726   19225
512000  1      278.08  278.08  278.08
30484   2  27080   1038    28194
914     2  31041   12751   17026
244     2      10.56   10.56   54.25
19301   2  1212    15014   13332
13082   1   30265   27130   18809
82      2      3.52    3.52    10
27930   1  24736   25856   2013
31960   2  30670   4205    29465
1       2      0       0       0
512000  1      278.08  278.08  278.18
13280   2  5806    9668    4722
189     1  23559   30526   23638
21618   2  9397    2508    29365
16411   1  29546   29613   20746
244     2      10.56   10.56   53.75
4780    1   17484   11071   31197
3473    1  7037    23313   30944
244     2      10.56   10.56   54
11163   2  18840   14636   6122
6284    1  24329   1531    23432
22177   1   22399   3834    5480
406     2      17.6    17.6    6
16321   2  32277   25179   2600
27494   1  26311   26677   9994
22688   1   31907   23668   18598
990     2   12988   29304   26203
82      2      3.52    3.52    19.75
21727   1  14384   8669    24409
26549   1  13666   29183   8238
11780   1  7677    8721    16645
21191   2  9676    21098   25895
325     2      14.08   14.08   6
406     2      17.6    17.6    3.25
1       2      0       0       6.5
9856    1  19692   27390   7405
325     2      14.08   14.08   8
18727   2  30788   31734   10020
9588    1  2774    10139   3059
23478   1   16742   6354    3819
82      2      3.52    3.52    14
7250    1  490     27628   29063
28262   1  63      1615    27829
28110   2   21775   2926    32665
167     1   19128   10728   25901
16520   2  15282   19995   975
163     2      7.04    7.04    0
406     2      17.6    17.6    7
163     2      7.04    7.04    0
1009    1  1280    28820   24775
8836    2  30106   30978   13388
13647   1   31813   21440   13466
163     2      7.04    7.04    7.5
512000  1      278.08  278.08  278.06
22139   2  21304   16133   5611
15273   2  20969   30200   17961
11203   1  14305   17467   8832
28129   1   27111   27290   22391
325     2      14.08   14.08   8
19879   1  32318   24778   9265
28468   1  13558   17160   1075
27769   2   23192   21010   27649

در پست بعدی یه مثال از این الگوریتم اوردم . ممنونم از همه ی دوستای خوبم به خاطر راهنماییتون.
« آخرین ویرایش: 17 فروردین 1395، 04:10 ب‌ظ توسط oostaa »

آفلاین oostaa

  • Jr. Member
  • *
  • ارسال: 91
  • جنسیت : پسر
پاسخ : انتخاب سطرهای خاص با bashscript یا awk
« پاسخ #1 : 17 فروردین 1395، 04:09 ب‌ظ »
مثالی از الگوریتم فوق:
325     2      14.08   14.08   8
28468   1  14.08   14.08   1075
27769   1  23192   21010   27649
28468   1  14.08   14.08   1075
19879   2  14.08   14.08   9265
28468   1  23192   21010   1075
27769   1  23192   21010   27649
در مرحله اول سطرهایی که ستون سوم و چهارمشون یکسانه رو جدا میکنه!
325     2      14.08   14.08   8
28468   1  14.08   14.08   1075
28468   1  14.08   14.08   1075
19879   2  14.08   14.08   9265
2669   1  23192   21010   27649
28468   1  23192   21010   1075
27769   1  23192   21010   27649
اگه در بین ستون دومه سطرهایی که ستون سوم و چهارمشون یکسانه عدد 2 وجود داشت سطرایی که ستون دومشون برابره با 1 حذف میشن و از بین اون سطرهایی که ستون دومشون 2 میباشه  اون سطری حفظ میشه که ستون پنجمش بالاترین مقدارو داشته باشه و بقیه حذف میشن. مثل زیر:
325     2      14.08   14.08   8
28468   1  14.08   14.08   1075
28468   1  14.08   14.08   1075
19879   2  14.08   14.08   9265
که با توضیح بالا فقط این ستون باقی میمونه:
19879   2  14.08   14.08   9265
اگه در بین ستون دومه سطرهایی که ستون سوم و چهارمشون یکسانه عدد 2 وجود نداشت فقط سطری باقی میمونه که ستون پنجمش کمتر از همه س. مثل زیر:
2669   1  23192   21010   27649
28468   1  23192   21010   1075
27769   1  23192   21010   27649
که با توضیح بالا فقط این ستون باقی میمونه:
2669   1  23192   21010   27649


 

آفلاین احسان فعالپور

  • Sr. Member
  • *
  • ارسال: 408
  • جنسیت : پسر
پاسخ : انتخاب سطرهای خاص با bashscript یا awk
« پاسخ #2 : 22 فروردین 1395، 11:17 ب‌ظ »
نیازی نیست که سطرهایی که ستون سوم و چهارمشون تکرار نشده رو هم چاپ کنیم که، هست؟
من تا الان کلی فکر کردم که چجوری این سوال رو حل کنم و فعلا توی قدم اول تونستم سطرهایی که ستون سوم و چهارمشون تکراریه رو پرینت کنم.
عضو ارشد فدراسیون بیکاران ایران FBI

آفلاین oostaa

  • Jr. Member
  • *
  • ارسال: 91
  • جنسیت : پسر
پاسخ : انتخاب سطرهای خاص با bashscript یا awk
« پاسخ #3 : 23 فروردین 1395، 12:20 ق‌ظ »
متاسفانه اونا هم باید چاپ بشن .  ](*,) راستی این لینک هم یه مساله شبیه به همین مساله س.
http://forum.ubuntu.ir/index.php/topic,131931.0.html

آفلاین احسان فعالپور

  • Sr. Member
  • *
  • ارسال: 408
  • جنسیت : پسر
پاسخ : انتخاب سطرهای خاص با bashscript یا awk
« پاسخ #4 : 23 فروردین 1395، 12:41 ق‌ظ »
کار سخت شد، من تریبا چند ساعته که مداد دستمه و هی دارم مراحل الگوریتمی که باید طی بشه رو تصحیح میکنم، کاش از اول میگفتین که اون سطرها هم بایستی چاپ بشن، من تا الان هر چی فکر کردم همش با فرض نادرست بوده و با همین فرض الان میتونم تمام سطرهایی که ستون سوم و چهارم مشابه دارند رو جدا کنم و اگه ستون دومشون دو داشت یک ها رو حذف کنم و در غیر اینصورت دوها رو حذف کنم، فقط مرحله آخر مونده بود که بیام و طبق ستون پنجمشون اونها رو دسته بندی کنم، ولی حیف شد که پیشفرض اشتباه بوده. ](*,)
عضو ارشد فدراسیون بیکاران ایران FBI

آفلاین oostaa

  • Jr. Member
  • *
  • ارسال: 91
  • جنسیت : پسر
پاسخ : انتخاب سطرهای خاص با bashscript یا awk
« پاسخ #5 : 23 فروردین 1395، 01:19 ق‌ظ »
احسان جان ببخش  قصور از من بوده . این قسمتو فکر نکرده بودم . بازم ممنونم به خاطر زحماتت. راستی میشه چن تا منبع خوب فارسی برای awk بهم معرفی کنی؟ من ویدیو هاشو گیر اوردم اما زبان اصلیه گرچه بعضا میفهمم که چی میگه اما فایل پی دی اف یا کتاب رو ترحیج میدم .

آفلاین احسان فعالپور

  • Sr. Member
  • *
  • ارسال: 408
  • جنسیت : پسر
پاسخ : انتخاب سطرهای خاص با bashscript یا awk
« پاسخ #6 : 23 فروردین 1395، 01:32 ق‌ظ »
واللا ویدیوی آموزشی زیاد خوب مباحثش رو تشریح نمیکنه معمولا، من این کتاب رو خوندم:
http://shop.oreilly.com/product/0636920033820.do
منبع فارسی سراغ ندارم واسش.
اما این مسئله رو من تقریبا ۷۰٪ مطمئنم که حلش کردم، ببینید الان میتونم بدون اون قضیه نمایش خطوط بدون تکرار در دو مرحله استفاده از awk سوال رو حل کنم که برای اون فرض اشتباهی هم که داشتم میتونم با استفاده از دستوراتی مثل grep ( یا شایدم چیزای دیگه) مکمل لیست اولیه رو دربیارم.
عضو ارشد فدراسیون بیکاران ایران FBI

آفلاین oostaa

  • Jr. Member
  • *
  • ارسال: 91
  • جنسیت : پسر
پاسخ : انتخاب سطرهای خاص با bashscript یا awk
« پاسخ #7 : 23 فروردین 1395، 01:50 ق‌ظ »
ممنونم ازت . کتابو دانلود کردم اگه فرصت شد یه خلاصه ازش مینویسم و منتشر میکنم که یه منبع فارسی وجود داشته باشه برای زبان برنامه نویسی awk .
خسته نباشی اقا احسان. ممنونم ازت .  :)

آفلاین alend

  • High Hero Member
  • *
  • ارسال: 1319
پاسخ : انتخاب سطرهای خاص با bashscript یا awk
« پاسخ #8 : 23 فروردین 1395، 08:28 ق‌ظ »
با آر زیاد سخت نیست.

آفلاین احسان فعالپور

  • Sr. Member
  • *
  • ارسال: 408
  • جنسیت : پسر
پاسخ : انتخاب سطرهای خاص با bashscript یا awk
« پاسخ #9 : 23 فروردین 1395، 10:08 ق‌ظ »
سخت بودن سوال فقط به این خاطره که شما باید یه سطر رو بخونی و توی کل فایل دنبال مشابهش بگردی، و چون فایل خیلی بزرگه(۵۰۰۰۰ خط) و تعداد دفعاتی هم که باید فایل خونده بشه به تعداد دسته های تکراریه پرفورمنس فوق‌العاده افت میکنه.
بدون توجه به این نکات خیلی راحت تر از اونچه که توی R پیاده سازی میشه کردش میشه توی پایتون نوشتش. منتها واسه من سرعت انجام کار مهم بود.
عضو ارشد فدراسیون بیکاران ایران FBI

آفلاین احسان فعالپور

  • Sr. Member
  • *
  • ارسال: 408
  • جنسیت : پسر
پاسخ : انتخاب سطرهای خاص با bashscript یا awk
« پاسخ #10 : 23 فروردین 1395، 05:53 ب‌ظ »
بدون در نظر گرفتن نمایش سطرهای بدون تکرار، اسکریپت زیر تا مرحله اول خواسته هاتون رو انجام میده. میشه برای ادامه‌ی کار(انتخاب بر اساس ستون پنجم) هم یه اسکریپت مجزا نوشت.
#!/usr/bin/bash

awk -O '
{
    if (($3, $4) in holder){
        #Qablan hamchin sotune 3 va 4 ee dashte am.
        if (holder[$3, $4] == 2){
            if (($3, $4) in tmpArray){
                print tmpArray[$3, $4]
                delete tmpArray[$3, $4]
            }
            if ($2 == 2){
                print $0
            }
        }else{
            if ($2 == 2){
                holder[$3, $4] = $2
                print $0
                delete oneHolders
            }else{
                oneHolders[$3, $4, ++oneCounter[$3, $4]] = $0
            }
        }
    }else{
        #Qablan in sotune 3 va 4 ra nadashte am.
        holder[$3, $4] = $2
        if ($2 == 1){
            oneHolders[$3, $4, ++oneCounter[$3, $4]] = $0
        }else{
            tmpArray[$3, $4] = $0
        }
    }
}
END {
    #printf("In the END section\n")
    for (line in oneHolders){
        split(line, checkUnique, SUBSEP)
        if(checkUnique[3] != 1){
            print(oneHolders[line])
        }
    }
    delete holder
    delete tmpArray
    delete oneHolders
    delete oneCounter
}
' "$1" | sort --parallel=4 -nk3,3 -k4,4
« آخرین ویرایش: 23 فروردین 1395، 05:55 ب‌ظ توسط احسان فعالپور »
عضو ارشد فدراسیون بیکاران ایران FBI

آفلاین oostaa

  • Jr. Member
  • *
  • ارسال: 91
  • جنسیت : پسر
پاسخ : انتخاب سطرهای خاص با bashscript یا awk
« پاسخ #11 : 23 فروردین 1395، 11:52 ب‌ظ »
خیلی خیلی ممنونم ازت اقا احسان . اما وقتی این فایل bash رو پسوند .sh  میدم و بعدش بهش مجوز میدم و رانش میکنم این جوابو میده :
bash: ./example.sh: /usr/bin/bash: bad interpreter: No such file or directory

فک میکنی اشکال از کجاست؟

آفلاین احسان فعالپور

  • Sr. Member
  • *
  • ارسال: 408
  • جنسیت : پسر
پاسخ : انتخاب سطرهای خاص با bashscript یا awk
« پاسخ #12 : 24 فروردین 1395، 12:02 ق‌ظ »
اگه خط اول رو با این عوض کنی چطور؟
#!/bin/bash ران میشه؟
عضو ارشد فدراسیون بیکاران ایران FBI

آفلاین oostaa

  • Jr. Member
  • *
  • ارسال: 91
  • جنسیت : پسر
پاسخ : انتخاب سطرهای خاص با bashscript یا awk
« پاسخ #13 : 24 فروردین 1395، 12:16 ق‌ظ »
بله . ران شد. ممنونم ازت به خاطر این همه زحمتی که کشیدی . به امید جبران .  :)
راستی کد بالا بر مرتب کردن بر اساس ستون پنجم رو هم انجام میده؟
دقیقا تا کجای الگوریتم رو انجام میده ؟ :)
« آخرین ویرایش: 24 فروردین 1395، 12:20 ق‌ظ توسط oostaa »

آفلاین احسان فعالپور

  • Sr. Member
  • *
  • ارسال: 408
  • جنسیت : پسر
پاسخ : انتخاب سطرهای خاص با bashscript یا awk
« پاسخ #14 : 24 فروردین 1395، 12:38 ق‌ظ »
این کد از بین سطرهایی که ستون سوم و چهارمشون لا‌اقل یکبار تکرار شده مرحله‌ی اول الگوریتمتون رو انجام میده، یعنی از بین سطرهای انتخاب شده بر‌حسب مقدار ستون دوم اگر مقدار دو توی این ستون پیدا کرد سطرهایی که ستون دومشون یک بودند رو حذف میکنه، و همینطور اگر هیچ دویی توی ستون دوم پیدا نکرد همه سطرهای باقیمونده رو پرینت میکنه.
عضو ارشد فدراسیون بیکاران ایران FBI