انجمنهای فارسی اوبونتو
کمک و پشتیبانی => نرمافزارهای فنی-مهندسی => نویسنده: 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
در پست بعدی یه مثال از این الگوریتم اوردم . ممنونم از همه ی دوستای خوبم به خاطر راهنماییتون.
-
مثالی از الگوریتم فوق:
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
-
نیازی نیست که سطرهایی که ستون سوم و چهارمشون تکرار نشده رو هم چاپ کنیم که، هست؟
من تا الان کلی فکر کردم که چجوری این سوال رو حل کنم و فعلا توی قدم اول تونستم سطرهایی که ستون سوم و چهارمشون تکراریه رو پرینت کنم.
-
متاسفانه اونا هم باید چاپ بشن . ](*,) راستی این لینک هم یه مساله شبیه به همین مساله س.
http://forum.ubuntu.ir/index.php/topic,131931.0.html
-
کار سخت شد، من تریبا چند ساعته که مداد دستمه و هی دارم مراحل الگوریتمی که باید طی بشه رو تصحیح میکنم، کاش از اول میگفتین که اون سطرها هم بایستی چاپ بشن، من تا الان هر چی فکر کردم همش با فرض نادرست بوده و با همین فرض الان میتونم تمام سطرهایی که ستون سوم و چهارم مشابه دارند رو جدا کنم و اگه ستون دومشون دو داشت یک ها رو حذف کنم و در غیر اینصورت دوها رو حذف کنم، فقط مرحله آخر مونده بود که بیام و طبق ستون پنجمشون اونها رو دسته بندی کنم، ولی حیف شد که پیشفرض اشتباه بوده. ](*,)
-
احسان جان ببخش قصور از من بوده . این قسمتو فکر نکرده بودم . بازم ممنونم به خاطر زحماتت. راستی میشه چن تا منبع خوب فارسی برای awk بهم معرفی کنی؟ من ویدیو هاشو گیر اوردم اما زبان اصلیه گرچه بعضا میفهمم که چی میگه اما فایل پی دی اف یا کتاب رو ترحیج میدم .
-
واللا ویدیوی آموزشی زیاد خوب مباحثش رو تشریح نمیکنه معمولا، من این کتاب رو خوندم:
http://shop.oreilly.com/product/0636920033820.do
منبع فارسی سراغ ندارم واسش.
اما این مسئله رو من تقریبا ۷۰٪ مطمئنم که حلش کردم، ببینید الان میتونم بدون اون قضیه نمایش خطوط بدون تکرار در دو مرحله استفاده از awk سوال رو حل کنم که برای اون فرض اشتباهی هم که داشتم میتونم با استفاده از دستوراتی مثل grep ( یا شایدم چیزای دیگه) مکمل لیست اولیه رو دربیارم.
-
ممنونم ازت . کتابو دانلود کردم اگه فرصت شد یه خلاصه ازش مینویسم و منتشر میکنم که یه منبع فارسی وجود داشته باشه برای زبان برنامه نویسی awk .
خسته نباشی اقا احسان. ممنونم ازت . :)
-
با آر زیاد سخت نیست.
-
سخت بودن سوال فقط به این خاطره که شما باید یه سطر رو بخونی و توی کل فایل دنبال مشابهش بگردی، و چون فایل خیلی بزرگه(۵۰۰۰۰ خط) و تعداد دفعاتی هم که باید فایل خونده بشه به تعداد دسته های تکراریه پرفورمنس فوقالعاده افت میکنه.
بدون توجه به این نکات خیلی راحت تر از اونچه که توی R پیاده سازی میشه کردش میشه توی پایتون نوشتش. منتها واسه من سرعت انجام کار مهم بود.
-
بدون در نظر گرفتن نمایش سطرهای بدون تکرار، اسکریپت زیر تا مرحله اول خواسته هاتون رو انجام میده. میشه برای ادامهی کار(انتخاب بر اساس ستون پنجم) هم یه اسکریپت مجزا نوشت.
#!/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
-
خیلی خیلی ممنونم ازت اقا احسان . اما وقتی این فایل bash رو پسوند .sh میدم و بعدش بهش مجوز میدم و رانش میکنم این جوابو میده :
bash: ./example.sh: /usr/bin/bash: bad interpreter: No such file or directory
فک میکنی اشکال از کجاست؟
-
اگه خط اول رو با این عوض کنی چطور؟
#!/bin/bash
ران میشه؟
-
بله . ران شد. ممنونم ازت به خاطر این همه زحمتی که کشیدی . به امید جبران . :)
راستی کد بالا بر مرتب کردن بر اساس ستون پنجم رو هم انجام میده؟
دقیقا تا کجای الگوریتم رو انجام میده ؟ :)
-
این کد از بین سطرهایی که ستون سوم و چهارمشون لااقل یکبار تکرار شده مرحلهی اول الگوریتمتون رو انجام میده، یعنی از بین سطرهای انتخاب شده برحسب مقدار ستون دوم اگر مقدار دو توی این ستون پیدا کرد سطرهایی که ستون دومشون یک بودند رو حذف میکنه، و همینطور اگر هیچ دویی توی ستون دوم پیدا نکرد همه سطرهای باقیمونده رو پرینت میکنه.
-
احسان عزیز فک کنم الگوریتم نوشته شده با الگوریتمی که من تو صورت نوشتم یه اپسیلون فرق داره . من میخواستم اگه ستون دوم توش 2 باشه همه ی اونایی که ستون دومشون 1 میباشه حذف بشن و از بین اونایی سطرای مشابه باقی مونده سطری حفظ بشه که ستون پنجمش بیشترین مقدارو داشته باشه . و اگه بین ستون دوم ها 2 وجود نداشت فقط اونی حفظ بشه که ستون پنجمش کمترین مقدارو داره . این کد این کارو میکنه ؟ :)
-
همش رو نه ولی از اینجا به بعدش کار نباید زیاد سخت باشه براتون.
الان توی خروجیای که میگیرید دو سطری که ستون سوم و چهارم یکسان دارن یا ستون دومی برابر دو دارند که در این صورت بقیهی سطرهایی م که ستون سوم و چهارم مشابه دارن همینطور خواهند بود یا اینکه کلا دو توی ستوندوم وجود نداره و همه نمونه های تکرار شده سطر دومشون برابر یک خواهد بود.
از اینجا به بعدش سوالتون شبیه سوال قبلیتون میشه، اگه ستون دوم دو بود ستون پنجم ماکس رو برگردون اگه نه مین رو برگردون.
-
[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 رو بیخیال شیم و از قسمت اول و دوم اینطور استفاده کنیم× قسمت اول چون فقط ۲ ها وجود دارن ماکس ستون پنجهای هر گروه رو میخوایم وقسمت بعد مینش رو.
اینجاش رو میتونی خودت انجام بدی؟
-
من الان دقیقا متوجه نشدم.تو الان برای تغییرات فوق کدی نوشتی که اون سطرای مشابه که در ستون دومشون 2 هس max ستون پنجم رو حفظ میکنه و برای اونایی که در ستون دومشون 2 ندارن min رو حفظ میکنه؟
اگه امکانش باشه که uniq ها تفکیک بشن عالیه .
-
یه پیشنهاد برای الگوریتم :
میتونیم به صورت ماتریس این مساله رو حل کنیم . ستون سوم رو متغیر افقی و ستون چهارم رو متغیر عمودی ماتریس در نظر بگیریم و ستون پنجم هم درایه های ماتریس باشن و در ابتدا همه ی داریه ها صفر باشن و با هر سطری که مفسر میاد پایین اگه ستون پنجم تغییر کنه و بزرگتر باشه اون عدد رو جایگزین عدد قبلی کنه .
-
من الان دقیقا متوجه نشدم.تو الان برای تغییرات فوق کدی نوشتی که اون سطرای مشابه که در ستون دومشون 2 هس max ستون پنجم رو حفظ میکنه و برای اونایی که در ستون دومشون 2 ندارن min رو حفظ میکنه؟
اگه امکانش باشه که uniq ها تفکیک بشن عالیه .
ببین خروجیه کدی که تا الان نوشتم سه تا بخش داره، سطرهایی که ستون دومشون دو هست، یک هست و uniq هستند.
البته این فقط یه حرکت ساده نیست که بگم هر سطری ستون دوش یک بود رو اینجا بذار ،یا اگه دو بود بذار اونجا، من در واقع اومدم بعد از چک کردن سطر به سطر فایل گفتم که اگه سطر جاری تکرار شده و ستون دومش دو هستش پس از این به بعد سطری که ستون سه و چهارش مثله همین سطره و ستون دومش یکه رو اسکیپ کن.
و همینطور هم در مورد سطرهای تکراری با ستون دوم برابر با یک این روند رو داریم:
اگه این سطری که خوندی قبلا نمونه مشابهی ازش داشتی(تکراری باشه) و اون نمونه مشابه هم ستون دومش دو نبوده پس این رو هم توی قسمت یک ها پرینت کن.
دست آخر هم سطرهای بدون تکرار.
تو الان باید بیای و یکم با ترمینال کار کنی، خروجی رو با دستوراتی که میتونی سه بخشش کنی،برای بخش اول یه اسکریپت که فقط ماکس ها رو بده بنویسی، برای بخش دوم مین ها و بخش سوم هم که خودش جوابه.
-
عالیه .اره بقیه ش دیگه راحته . یه کم کار کنم میتونم ادامه شو انجام بدم .دمت گرم . :)
اقای فعالپور با چه کدی میشه این کارا رو انجام داد؟
-
#!/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
-
ممنونم اقای فعالپور. طبق توصیه تون دارم سعی میکنم خودم یک چنین برنامه ای بنویسم . و یاد بگیرم . ان شالله تا دو سه روز دیگه برنامه رو تو گروه میذارم و حتما ازتون مشاوره میگیرم . البته اگه وقت داشته باشید. :)
بازم تشکر.
-
اینم از آخرین کدی که من نوشتم، توی این کد شما بعد از اجرا ۳ تا فایل تکست میگیرید که یکیش مربوط به سطرهایی با ستون ۲ هستش و دیگری با ستون یک و آخری هم سطرهای بدون تکرار، برای راحتیه کار دو تا فایل اول سورت هم شدن که دیگه تنها کاری که میمونه انتخابشون برا اساس ستون پنجمشونه.
#!/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
-
عالیه . فک کنم تشکرام تکراری شده اما بازم خیلی خیلی ممنونم احسان جان .