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

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

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


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

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

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

آفلاین oostaa

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

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

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

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

  • Sr. Member
  • *
  • ارسال: 408
  • جنسیت : پسر
پاسخ : انتخاب سطرهای خاص با bashscript یا awk
« پاسخ #17 : 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 رو بیخیال شیم و از قسمت اول و دوم اینطور استفاده کنیم× قسمت اول چون فقط ۲ ها وجود دارن ماکس ستون پنجهای هر گروه رو میخوایم وقسمت بعد مینش رو.
اینجاش رو میتونی خودت انجام بدی؟
« آخرین ویرایش: 25 فروردین 1395، 02:29 ق‌ظ توسط احسان فعالپور »
عضو ارشد فدراسیون بیکاران ایران FBI

آفلاین oostaa

  • Jr. Member
  • *
  • ارسال: 91
  • جنسیت : پسر
پاسخ : انتخاب سطرهای خاص با bashscript یا awk
« پاسخ #18 : 25 فروردین 1395، 12:33 ق‌ظ »
من الان دقیقا متوجه نشدم.تو الان برای تغییرات فوق کدی نوشتی که اون سطرای مشابه که در ستون دومشون 2 هس max ستون پنجم رو حفظ میکنه و برای اونایی که در ستون دومشون 2 ندارن min  رو حفظ میکنه؟

اگه امکانش باشه که uniq ها تفکیک بشن عالیه .
« آخرین ویرایش: 25 فروردین 1395، 12:54 ق‌ظ توسط oostaa »

آفلاین oostaa

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

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

  • Sr. Member
  • *
  • ارسال: 408
  • جنسیت : پسر
پاسخ : انتخاب سطرهای خاص با bashscript یا awk
« پاسخ #20 : 25 فروردین 1395، 01:10 ق‌ظ »
من الان دقیقا متوجه نشدم.تو الان برای تغییرات فوق کدی نوشتی که اون سطرای مشابه که در ستون دومشون 2 هس max ستون پنجم رو حفظ میکنه و برای اونایی که در ستون دومشون 2 ندارن min  رو حفظ میکنه؟

اگه امکانش باشه که uniq ها تفکیک بشن عالیه .
ببین خروجیه کدی که تا الان نوشتم سه تا بخش داره،‌ سطرهایی که ستون دومشون دو هست، یک هست و uniq  هستند.
البته این فقط یه حرکت ساده نیست که بگم هر سطری ستون دوش یک بود رو اینجا بذار ،‌یا اگه دو بود بذار اونجا، من در واقع اومدم بعد از چک کردن سطر به سطر فایل گفتم که اگه سطر جاری تکرار شده و ستون دومش دو هستش پس از این به بعد سطری که ستون سه و چهارش مثله همین سطره و ستون دومش یکه رو اسکیپ کن.
و همینطور هم در مورد سطرهای تکراری با ستون دوم برابر با یک این روند رو داریم:
اگه این سطری که خوندی قبلا نمونه مشابهی ازش داشتی(تکراری باشه) و اون نمونه مشابه هم ستون دومش دو نبوده پس این رو هم توی قسمت یک ها پرینت کن.
دست آخر هم سطرهای بدون تکرار.
تو الان باید بیای و یکم با ترمینال کار کنی، خروجی رو با دستوراتی که میتونی سه بخشش کنی،‌برای بخش اول یه اسکریپت که فقط ماکس ها رو بده بنویسی، برای بخش دوم مین ها و بخش سوم هم که خودش جوابه.
عضو ارشد فدراسیون بیکاران ایران FBI

آفلاین oostaa

  • Jr. Member
  • *
  • ارسال: 91
  • جنسیت : پسر
پاسخ : انتخاب سطرهای خاص با bashscript یا awk
« پاسخ #21 : 25 فروردین 1395، 01:21 ق‌ظ »
عالیه .اره بقیه ش دیگه راحته . یه کم کار کنم میتونم ادامه شو انجام بدم .دمت گرم .  :)
اقای فعالپور با چه کدی میشه این کارا رو انجام داد؟
« آخرین ویرایش: 25 فروردین 1395، 01:33 ق‌ظ توسط oostaa »

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

  • Sr. Member
  • *
  • ارسال: 408
  • جنسیت : پسر
پاسخ : انتخاب سطرهای خاص با bashscript یا awk
« پاسخ #22 : 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
« آخرین ویرایش: 25 فروردین 1395، 02:28 ق‌ظ توسط احسان فعالپور »
عضو ارشد فدراسیون بیکاران ایران FBI

آفلاین oostaa

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

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

  • Sr. Member
  • *
  • ارسال: 408
  • جنسیت : پسر
پاسخ : انتخاب سطرهای خاص با bashscript یا awk
« پاسخ #24 : 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

عضو ارشد فدراسیون بیکاران ایران FBI

آفلاین oostaa

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