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

کمک و پشتیبانی => نرم‌افزارهای فنی-مهندسی => نویسنده: oostaa در 17 فروردین 1395، 04:05 ب‌ظ

عنوان: انتخاب سطرهای خاص با bashscript یا awk
ارسال شده توسط: oostaa در 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

در پست بعدی یه مثال از این الگوریتم اوردم . ممنونم از همه ی دوستای خوبم به خاطر راهنماییتون.
عنوان: پاسخ : انتخاب سطرهای خاص با bashscript یا awk
ارسال شده توسط: oostaa در 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


 
عنوان: پاسخ : انتخاب سطرهای خاص با bashscript یا awk
ارسال شده توسط: احسان فعالپور در 22 فروردین 1395، 11:17 ب‌ظ
نیازی نیست که سطرهایی که ستون سوم و چهارمشون تکرار نشده رو هم چاپ کنیم که، هست؟
من تا الان کلی فکر کردم که چجوری این سوال رو حل کنم و فعلا توی قدم اول تونستم سطرهایی که ستون سوم و چهارمشون تکراریه رو پرینت کنم.
عنوان: پاسخ : انتخاب سطرهای خاص با bashscript یا awk
ارسال شده توسط: oostaa در 23 فروردین 1395، 12:20 ق‌ظ
متاسفانه اونا هم باید چاپ بشن .  ](*,) راستی این لینک هم یه مساله شبیه به همین مساله س.
http://forum.ubuntu.ir/index.php/topic,131931.0.html
عنوان: پاسخ : انتخاب سطرهای خاص با bashscript یا awk
ارسال شده توسط: احسان فعالپور در 23 فروردین 1395، 12:41 ق‌ظ
کار سخت شد، من تریبا چند ساعته که مداد دستمه و هی دارم مراحل الگوریتمی که باید طی بشه رو تصحیح میکنم، کاش از اول میگفتین که اون سطرها هم بایستی چاپ بشن، من تا الان هر چی فکر کردم همش با فرض نادرست بوده و با همین فرض الان میتونم تمام سطرهایی که ستون سوم و چهارم مشابه دارند رو جدا کنم و اگه ستون دومشون دو داشت یک ها رو حذف کنم و در غیر اینصورت دوها رو حذف کنم، فقط مرحله آخر مونده بود که بیام و طبق ستون پنجمشون اونها رو دسته بندی کنم، ولی حیف شد که پیشفرض اشتباه بوده. ](*,)
عنوان: پاسخ : انتخاب سطرهای خاص با bashscript یا awk
ارسال شده توسط: oostaa در 23 فروردین 1395، 01:19 ق‌ظ
احسان جان ببخش  قصور از من بوده . این قسمتو فکر نکرده بودم . بازم ممنونم به خاطر زحماتت. راستی میشه چن تا منبع خوب فارسی برای awk بهم معرفی کنی؟ من ویدیو هاشو گیر اوردم اما زبان اصلیه گرچه بعضا میفهمم که چی میگه اما فایل پی دی اف یا کتاب رو ترحیج میدم .
عنوان: پاسخ : انتخاب سطرهای خاص با bashscript یا awk
ارسال شده توسط: احسان فعالپور در 23 فروردین 1395، 01:32 ق‌ظ
واللا ویدیوی آموزشی زیاد خوب مباحثش رو تشریح نمیکنه معمولا، من این کتاب رو خوندم:
http://shop.oreilly.com/product/0636920033820.do
منبع فارسی سراغ ندارم واسش.
اما این مسئله رو من تقریبا ۷۰٪ مطمئنم که حلش کردم، ببینید الان میتونم بدون اون قضیه نمایش خطوط بدون تکرار در دو مرحله استفاده از awk سوال رو حل کنم که برای اون فرض اشتباهی هم که داشتم میتونم با استفاده از دستوراتی مثل grep ( یا شایدم چیزای دیگه) مکمل لیست اولیه رو دربیارم.
عنوان: پاسخ : انتخاب سطرهای خاص با bashscript یا awk
ارسال شده توسط: oostaa در 23 فروردین 1395، 01:50 ق‌ظ
ممنونم ازت . کتابو دانلود کردم اگه فرصت شد یه خلاصه ازش مینویسم و منتشر میکنم که یه منبع فارسی وجود داشته باشه برای زبان برنامه نویسی awk .
خسته نباشی اقا احسان. ممنونم ازت .  :)
عنوان: پاسخ : انتخاب سطرهای خاص با bashscript یا awk
ارسال شده توسط: alend در 23 فروردین 1395، 08:28 ق‌ظ
با آر زیاد سخت نیست.
عنوان: پاسخ : انتخاب سطرهای خاص با bashscript یا awk
ارسال شده توسط: احسان فعالپور در 23 فروردین 1395، 10:08 ق‌ظ
سخت بودن سوال فقط به این خاطره که شما باید یه سطر رو بخونی و توی کل فایل دنبال مشابهش بگردی، و چون فایل خیلی بزرگه(۵۰۰۰۰ خط) و تعداد دفعاتی هم که باید فایل خونده بشه به تعداد دسته های تکراریه پرفورمنس فوق‌العاده افت میکنه.
بدون توجه به این نکات خیلی راحت تر از اونچه که توی R پیاده سازی میشه کردش میشه توی پایتون نوشتش. منتها واسه من سرعت انجام کار مهم بود.
عنوان: پاسخ : انتخاب سطرهای خاص با bashscript یا awk
ارسال شده توسط: احسان فعالپور در 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
عنوان: پاسخ : انتخاب سطرهای خاص با bashscript یا awk
ارسال شده توسط: oostaa در 23 فروردین 1395، 11:52 ب‌ظ
خیلی خیلی ممنونم ازت اقا احسان . اما وقتی این فایل bash رو پسوند .sh  میدم و بعدش بهش مجوز میدم و رانش میکنم این جوابو میده :
bash: ./example.sh: /usr/bin/bash: bad interpreter: No such file or directory

فک میکنی اشکال از کجاست؟
عنوان: پاسخ : انتخاب سطرهای خاص با bashscript یا awk
ارسال شده توسط: احسان فعالپور در 24 فروردین 1395، 12:02 ق‌ظ
اگه خط اول رو با این عوض کنی چطور؟
#!/bin/bash ران میشه؟
عنوان: پاسخ : انتخاب سطرهای خاص با bashscript یا awk
ارسال شده توسط: oostaa در 24 فروردین 1395، 12:16 ق‌ظ
بله . ران شد. ممنونم ازت به خاطر این همه زحمتی که کشیدی . به امید جبران .  :)
راستی کد بالا بر مرتب کردن بر اساس ستون پنجم رو هم انجام میده؟
دقیقا تا کجای الگوریتم رو انجام میده ؟ :)
عنوان: پاسخ : انتخاب سطرهای خاص با bashscript یا awk
ارسال شده توسط: احسان فعالپور در 24 فروردین 1395، 12:38 ق‌ظ
این کد از بین سطرهایی که ستون سوم و چهارمشون لا‌اقل یکبار تکرار شده مرحله‌ی اول الگوریتمتون رو انجام میده، یعنی از بین سطرهای انتخاب شده بر‌حسب مقدار ستون دوم اگر مقدار دو توی این ستون پیدا کرد سطرهایی که ستون دومشون یک بودند رو حذف میکنه، و همینطور اگر هیچ دویی توی ستون دوم پیدا نکرد همه سطرهای باقیمونده رو پرینت میکنه.
عنوان: پاسخ : انتخاب سطرهای خاص با bashscript یا awk
ارسال شده توسط: oostaa در 24 فروردین 1395، 12:46 ق‌ظ
احسان عزیز  فک کنم الگوریتم نوشته شده با الگوریتمی که من تو صورت نوشتم یه اپسیلون فرق داره . من میخواستم اگه ستون دوم توش 2 باشه همه ی اونایی که ستون دومشون 1 میباشه حذف بشن و از بین اونایی سطرای مشابه باقی مونده سطری حفظ بشه که ستون پنجمش بیشترین مقدارو داشته باشه . و اگه بین ستون دوم ها 2 وجود نداشت فقط اونی حفظ بشه که ستون پنجمش کمترین مقدارو داره . این کد این کارو میکنه ؟ :)
عنوان: پاسخ : انتخاب سطرهای خاص با bashscript یا awk
ارسال شده توسط: احسان فعالپور در 24 فروردین 1395، 12:54 ق‌ظ
 همش رو نه ولی از اینجا به بعدش کار نباید زیاد سخت باشه براتون.
الان توی خروجی‌ای که میگیرید دو سطری که ستون سوم و چهارم یکسان دارن یا ستون دومی برابر دو دارند که در این صورت بقیه‌ی سطرهایی م که ستون سوم و چهارم مشابه دارن همینطور خواهند بود یا اینکه کلا دو توی ستوندوم وجود نداره و همه نمونه های تکرار شده سطر دومشون برابر یک خواهد بود.
از اینجا به بعدش سوالتون شبیه سوال قبلیتون میشه، اگه ستون دوم دو بود ستون پنجم ماکس رو برگردون اگه نه مین رو برگردون.
عنوان: پاسخ : انتخاب سطرهای خاص با bashscript یا awk
ارسال شده توسط: احسان فعالپور در 25 فروردین 1395، 12:08 ق‌ظ
[0:~/Desktop]$./fuckBrain.sh newSource
Second Column = 2
1       2  0       0       6.5
1       2  0       0       12.325
21191   2  9676    21098   25895
21191   2  9676    21098   25895
325     2  14.08   14.08   8
325     2  14.08   14.08   8
21191   2  9676    21098   25895
28110   2  21775   2926    32665
28110   2  21775   2926    32665
163     2  7.04    7.04    7.5
163     2  7.04    7.04    7.5
1       2  0       0       12.325
325     2  14.08   14.08   8
163     2  7.04    7.04    0
1       2  0       0       12.325
1       2  0       0       12.325
1       2  0       2       12.325
1       2  0       2       12.325
244     2  10.56   10.56   54.25
244     2  10.56   10.56   54
27769   2  23192   21010   27649
27769   2  23192   21010   27649
21191   2  9676    21098   25895
163     2  7.04    7.04    0
244     2  10.56   10.56   54.25
1       2  0       0       0
244     2  10.56   10.56   54.25
1       2  0       0       12.325
82      2  3.52    3.52    10
82      2  3.52    3.52    19.75
27769   2  23192   21010   27649
30484   2  27080   1038    28194
30484   2  27080   1038    28194
1       2  0       0       12.325
406     2  17.6    17.6    7
406     2  17.6    17.6    3.25
21191   2  9676    21098   25895
325     2  14.08   14.08   8
244     2  10.56   10.56   53.75
163     2  7.04    7.04    0
244     2  10.56   10.56   54
244     2  10.56   10.56   54.25
22139   2  21304   16133   5611
22139   2  21304   16133   5611
27769   2  23192   21010   27649
19301   2  1212    15014   13332
19301   2  1212    15014   13332
27769   2  23192   21010   27649
30484   2  27080   1038    28194
1       2  0       0       12.325
163     2  7.04    7.04    7.5
Second Column = 1
512000  1  278.08  278.08  278.08
512000  1  278.08  278.08  278.06
27033   1  23517   17240   26872
21727   1  14384   8669    24409
167     1  19128   10728   25901
1       1  0       1       6.5
1       1  0       1       6.5
22177   1  22399   3834    5480
28468   1  13558   17160   1075
28468   1  13558   17160   1075
28468   1  13558   17160   1075
9856    1  19692   27390   7405
11203   1  14305   17467   8832
11203   1  14305   17467   8832
7250    1  490     27628   29063
6284    1  24329   1531    23432
6284    1  24329   1531    23432
Uniq Lines
18727   2  30788   31734   10020
27033   1  24065   17240   26872
16520   2  15282   19995   975
13647   1  31813   21440   13466
13280   2  5806    9668    4722
27494   1  26311   26677   9994
4780    1  17484   11071   31197
21795   1  27395   25726   19225
914     2  31041   12751   17026
23478   1  16742   6354    3819
11163   2  18840   14636   6122
16411   1  29546   29613   20746
9588    1  2774    10139   3059
22688   1  31907   23668   18598
31960   2  30670   4205    29465
21618   2  9397    2508    29365
19879   1  32318   24778   9265
13082   1  30265   27130   18809
27930   1  24736   25856   2013
27033   1  23517   16256   26872
1009    1  1280    28820   24775
87      2  19958   22037   13386

دیتاها:
[0:~/Desktop]$cat newSource
325     2  14.08   14.08   8
21191   2  9676    21098   25895
1       2  0       0       6.5
31960   2  30670   4205    29465
27769   2  23192   21010   27649
1       2  0       0       12.325
512000  1  278.08  278.08  278.06
21191   2  9676    21098   25895
244     2  10.56   10.56   54.25
28468   1  13558   17160   1075
13280   2  5806    9668    4722
19301   2  1212    15014   13332
22688   1  31907   23668   18598
406     2  17.6    17.6    7
325     2  14.08   14.08   8
1       1  0       0       6.5
163     2  7.04    7.04    7.5
11203   1  14305   17467   8832
23478   1  16742   6354    3819
82      2  3.52    3.52    10
21191   2  9676    21098   25895
512000  1  278.08  278.08  278.08
914     2  31041   12751   17026
13082   1  30265   27130   18809
28110   2  21775   2926    32665
4780    1  17484   11071   31197
9588    1  2774    10139   3059
7250    1  490     27628   29063
167     1  19128   10728   25901
19879   1  32318   24778   9265
28110   2  21775   2926    32665
1       2  0       2       12.325
163     2  7.04    7.04    7.5
512000  1  278.08  278.08  278.06
16411   1  29546   29613   20746
6284    1  24329   1531    23432
1       1  0       1       6.5
1       1  0       1       6.5
7250    1  490     27628   29063
1       2  0       0       12.325
325     2  14.08   14.08   8
163     2  7.04    7.04    0
6284    1  24329   1531    23432
1       2  0       0       12.325
9856    1  19692   27390   7405
1       2  0       0       12.325
87      2  19958   22037   13386
1       2  0       2       12.325
21795   1  27395   25726   19225
18727   2  30788   31734   10020
244     2  10.56   10.56   54
21727   1  14384   8669    24409
28468   1  13558   17160   1075
27769   2  23192   21010   27649
28468   1  13558   17160   1075
21191   2  9676    21098   25895
11203   1  14305   17467   8832
21618   2  9397    2508    29365
163     2  7.04    7.04    0
27033   1  23517   17240   26872
244     2  10.56   10.56   54.25
1009    1  1280    28820   24775
11163   2  18840   14636   6122
1       2  0       0       0
244     2  10.56   10.56   54.25
1       2  0       0       12.325
82      2  3.52    3.52    19.75
1       1  0       1       6.5
28468   1  13558   17160   1075
27769   2  23192   21010   27649
30484   2  27080   1038    28194
30484   2  27080   1038    28194
1       2  0       0       12.325
406     2  17.6    17.6    3.25
11203   1  14305   17467   8832
13647   1  31813   21440   13466
27930   1  24736   25856   2013
21191   2  9676    21098   25895
325     2  14.08   14.08   8
9856    1  19692   27390   7405
22177   1  22399   3834    5480
244     2  10.56   10.56   53.75
163     2  7.04    7.04    0
22139   2  21304   16133   5611
16520   2  15282   19995   975
167     1  19128   10728   25901
244     2  10.56   10.56   54
244     2  10.56   10.56   54.25
22139   2  21304   16133   5611
27769   2  23192   21010   27649
19301   2  1212    15014   13332
22177   1  22399   3834    5480
6284    1  24329   1531    23432
27769   2  23192   21010   27649
21727   1  14384   8669    24409
30484   2  27080   1038    28194
1       2  0       0       12.325
27494   1  26311   26677   9994
163     2  7.04    7.04    7.5
27033   1  23517   17240   26872

ادامه‌ی کار چیه حالا:
قسمت uniq lines رو بیخیال شیم و از قسمت اول و دوم اینطور استفاده کنیم× قسمت اول چون فقط ۲ ها وجود دارن ماکس ستون پنجهای هر گروه رو میخوایم وقسمت بعد مینش رو.
اینجاش رو میتونی خودت انجام بدی؟
عنوان: پاسخ : انتخاب سطرهای خاص با bashscript یا awk
ارسال شده توسط: oostaa در 25 فروردین 1395، 12:33 ق‌ظ
من الان دقیقا متوجه نشدم.تو الان برای تغییرات فوق کدی نوشتی که اون سطرای مشابه که در ستون دومشون 2 هس max ستون پنجم رو حفظ میکنه و برای اونایی که در ستون دومشون 2 ندارن min  رو حفظ میکنه؟

اگه امکانش باشه که uniq ها تفکیک بشن عالیه .
عنوان: پاسخ : انتخاب سطرهای خاص با bashscript یا awk
ارسال شده توسط: oostaa در 25 فروردین 1395، 12:43 ق‌ظ
یه پیشنهاد برای الگوریتم :
میتونیم به صورت ماتریس این مساله رو حل کنیم . ستون سوم رو متغیر افقی و ستون چهارم رو متغیر عمودی ماتریس در نظر بگیریم و ستون پنجم هم درایه های ماتریس باشن و در  ابتدا همه ی داریه ها صفر باشن و با هر سطری که مفسر میاد  پایین اگه ستون پنجم تغییر کنه و بزرگتر باشه اون عدد رو جایگزین عدد قبلی کنه . 
عنوان: پاسخ : انتخاب سطرهای خاص با bashscript یا awk
ارسال شده توسط: احسان فعالپور در 25 فروردین 1395، 01:10 ق‌ظ
من الان دقیقا متوجه نشدم.تو الان برای تغییرات فوق کدی نوشتی که اون سطرای مشابه که در ستون دومشون 2 هس max ستون پنجم رو حفظ میکنه و برای اونایی که در ستون دومشون 2 ندارن min  رو حفظ میکنه؟

اگه امکانش باشه که uniq ها تفکیک بشن عالیه .
ببین خروجیه کدی که تا الان نوشتم سه تا بخش داره،‌ سطرهایی که ستون دومشون دو هست، یک هست و uniq  هستند.
البته این فقط یه حرکت ساده نیست که بگم هر سطری ستون دوش یک بود رو اینجا بذار ،‌یا اگه دو بود بذار اونجا، من در واقع اومدم بعد از چک کردن سطر به سطر فایل گفتم که اگه سطر جاری تکرار شده و ستون دومش دو هستش پس از این به بعد سطری که ستون سه و چهارش مثله همین سطره و ستون دومش یکه رو اسکیپ کن.
و همینطور هم در مورد سطرهای تکراری با ستون دوم برابر با یک این روند رو داریم:
اگه این سطری که خوندی قبلا نمونه مشابهی ازش داشتی(تکراری باشه) و اون نمونه مشابه هم ستون دومش دو نبوده پس این رو هم توی قسمت یک ها پرینت کن.
دست آخر هم سطرهای بدون تکرار.
تو الان باید بیای و یکم با ترمینال کار کنی، خروجی رو با دستوراتی که میتونی سه بخشش کنی،‌برای بخش اول یه اسکریپت که فقط ماکس ها رو بده بنویسی، برای بخش دوم مین ها و بخش سوم هم که خودش جوابه.
عنوان: پاسخ : انتخاب سطرهای خاص با bashscript یا awk
ارسال شده توسط: oostaa در 25 فروردین 1395، 01:21 ق‌ظ
عالیه .اره بقیه ش دیگه راحته . یه کم کار کنم میتونم ادامه شو انجام بدم .دمت گرم .  :)
اقای فعالپور با چه کدی میشه این کارا رو انجام داد؟
عنوان: پاسخ : انتخاب سطرهای خاص با bashscript یا awk
ارسال شده توسط: احسان فعالپور در 25 فروردین 1395، 02:07 ق‌ظ
#!/usr/bin/bash

awk -O '
BEGIN {
    printf("Second Column = 2\n")
}
{
    if(($3, $4) in lineHolder){
        #Qablan in sotune 3 va 4 ra didam.
        delete uniqHolder[$3, $4]
        if (lineHolder[$3, $4] == 2){
            if (($3, $4) in two_holders){
                print two_holders[$3, $4]
                delete two_holders[$3, $4]
            }
            if ($2 == 2){
                print $0
            }
        }else{
            if ($2 == 2){
                lineHolder[$3, $4] = $2
                print $0
                delete one_holders
            }else{
                one_holders[$3, $4, ++oneCounter[$3, $4]] = $0
            }
        }
    }else{
        #Qablan in sotune 3 va 4 ra na-didam.
        lineHolder[$3, $4] = $2
        if($2 == 2){
            two_holders[$3, $4] = $0
        }else{
            one_holders[$3, $4, ++oneCounter[$3, $4]] = $0
        }
        #shayad az in khat faqat ye doone vojud dashte bashe.
        uniqHolder[$3, $4] = $0
    }
}
END {
    printf("Second Column = 1\n")
    for (line in one_holders){
        split(line, checkUnique, SUBSEP)
        if(checkUnique[3] != 1){
            print(one_holders[line])
        }
    }

    printf("Uniq Lines\n")
    for (line in uniqHolder){
        print(uniqHolder[line])
    }
   
    delete one_holders
    delete two_holders
    delete uniqHolder
    delete oneCounter
}
' "$1"
#| sort --parallel=4 -nk3,3 -k4,4
عنوان: پاسخ : انتخاب سطرهای خاص با bashscript یا awk
ارسال شده توسط: oostaa در 25 فروردین 1395، 08:43 ق‌ظ
ممنونم اقای فعالپور. طبق توصیه تون  دارم سعی میکنم خودم یک چنین برنامه ای بنویسم . و یاد بگیرم . ان شالله تا دو سه روز دیگه برنامه رو تو گروه میذارم و حتما ازتون مشاوره میگیرم . البته اگه وقت داشته باشید. :)
بازم تشکر.
عنوان: پاسخ : انتخاب سطرهای خاص با bashscript یا awk
ارسال شده توسط: احسان فعالپور در 25 فروردین 1395، 03:14 ب‌ظ
اینم از آخرین کدی که من نوشتم، توی این کد شما بعد از اجرا ۳ تا فایل تکست میگیرید که یکیش مربوط به سطرهایی با ستون ۲ هستش و دیگری با ستون یک و آخری هم سطرهای بدون تکرار، برای راحتیه کار دو تا فایل اول سورت هم شدن که دیگه تنها کاری که میمونه انتخابشون برا اساس ستون پنجمشونه.
#!/usr/bin/bash

awk -O '
BEGIN {
    #printf("Second Column = 2\n")
    #printf("\n")
}
{
    if(($3, $4) in lineHolder){
        #Qablan in sotune 3 va 4 ra didam.
        delete uniqHolder[$3, $4]
        if (lineHolder[$3, $4] == 2){
            if (($3, $4) in two_holders){
                print two_holders[$3, $4] > "2column.txt"
                delete two_holders[$3, $4]
            }
            if ($2 == 2){
                print $0 > "2column.txt"
            }
        }else{
            if ($2 == 2){
                lineHolder[$3, $4] = $2
                print $0 > "2column.txt"
                delete one_holders
            }else{
                one_holders[$3, $4, ++oneCounter[$3, $4]] = $0
            }
        }
    }else{
        #Qablan in sotune 3 va 4 ra na-didam.
        lineHolder[$3, $4] = $2
        if($2 == 2){
            two_holders[$3, $4] = $0
        }else{
            one_holders[$3, $4, ++oneCounter[$3, $4]] = $0
        }
        #shayad az in khat faqat ye doone vojud dashte bashe.
        uniqHolder[$3, $4] = $0
    }
}
END {
    #printf("Second Column = 1\n")
    #printf("\n")
    for (line in one_holders){
        split(line, checkUnique, SUBSEP)
        if(checkUnique[3] != 1){
            print(one_holders[line]) > "1column.txt"
        }
    }

    #printf("Uniq Lines\n")
    #printf("\n")
    for (line in uniqHolder){
        print(uniqHolder[line]) > "uniqs.txt"
    }
   
    delete one_holders
    delete two_holders
    delete uniqHolder
    delete oneCounter
}' "$1"
sort --parallel=4 -nk3,3 -k4,4 -k5,5 -r <2column.txt>2column.back && mv 2column.back 2column.txt
sort --parallel=4 -nk3,3 -k4,4 -k5,5 <1column.txt>1column.back && mv 1column.back 1column.txt

عنوان: پاسخ : انتخاب سطرهای خاص با bashscript یا awk
ارسال شده توسط: oostaa در 26 فروردین 1395، 10:04 ق‌ظ
عالیه . فک کنم تشکرام تکراری شده اما بازم خیلی خیلی ممنونم احسان جان .