امروز با یک آموزش خیلی کاربردی همراه شما خوبان هستیم. ما در این آموزش قصد داریم با معرفی چند دستور به شما و بررسی روش های ممکن در هر دستور روش های حذف خطوط تکراری در یک فایل در لینوکس را مرور کنیم. نحوه حذف خطوط تکراری در فایل یکی از مسائلی ست کاربرد بسیاری برای مدیران سرور و برنامه نویسان دارد.
فرض کنید فایلی با نام fruits.txt وجود دارد که محتوای آن به شکل زیر است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
fig grape coconut banana strawberry blackcurrant watermelon peach kiwi tangerine lemon papaya raspberry raspberry watermelon carrot orange orange peach blackcurrant banana pear pear carrot cherry blackberry cherry fig orange pomegranate tangerine lemon strawberry plum kiwi plum mango avacado fig banana mango apple avacado apple pear coconut plum apricot apple blueberry |
فایل مورد نظر حاوی ۵۰ خط که هر خط نام یک میوه می باشد. حال میخواهیم بدانیم این فایل حاوی چند میوه غیرتکراریست. در ادامه با ما باشید…
دستور wc
این دستور در لینوکس برای نمایش تعداد خط ها، کلمات و حتی تعداد بایت های مورد استفاده شده در یک فایل می باشد و دستوری بسیار کاربردی به حساب می آید. ما از این دستور به همراه سوئیچ ‘l-‘ (حرف کوچک) برای دانستن تعداد خطهای فایل مورد نظر استفاده میکنیم.
1 2 |
lsc@arshatech:~$ wc -l fruits.txt 50 fruits.txt |
همانطور که در خروجی میبینید عدد ۵۰ به ما نمایش داده شده است.
حذف خطوط تکراری از یک فایل
در ادامه به معرفی دستورهایی با ذکر مثال جهت آشنایی شما با نحوه حذف خطوط تکراری از یک فایل میپردازیم.
دستور sort
اگر شما میخواهید حذف خطوط تکراری را با این دستور انجام دهید باید از سوئیچ ‘u-‘ (حرف کوچک) برای این کار و به صورت زیر استفاده کنید:
1 |
lsc@arshatech:~$ sort -u fruits.txt |
این دستور ابتدا خطوط را به ترتیب حروف الفبا چیده و سپس با استفاده از سوئیچ مورد نظر خطوط را به صورت یکتا برای شما چاپ میکند.
دستور uniq
یکی دیگر از دستورهای قابل استفاده در لینوکس جهت حذف خطوط تکراری استفاده از دستور uniq در کنار دستور sort می باشد که دقیقا کاری را که در بالا توضیح دادیم انجام میدهد.
1 |
lsc@arshatech:$ sort fruits.txt | uniq |
دستور sed
sed یکی از دستورهای بسیار پرکاربرد برای ویرایش فایل ها در لینوکس می باشد. یکی از قابلیت های این دستور حذف خطوط تکراری از فایل هاست. ما در این روش ابتدا فایل مرود نظر را با دستور sort مرتب کرده و سپس خروجی آن را به sed جهت حذف خطوط تکراری میدهیم:
1 |
lsc@arshatech:$ sort fruits.txt | sed '$!N; /^\(.*\)\n\1$/!P; D' |
استفاده از awk
این دستور نیز مانند sed یکی از پرکاربردترین دستورات لینوکس بوده که حتی با آن میتوان اسکریپت هایی را با کاربردهای زیادی نوشت. awk یک فرمول کوتاه و ساده را برای حذف خطوط تکراری از یک فایل در اختیار شما قرار داده است:
1 |
lsc@arshatech:$ awk '!x[$0]++' fruits.txt |
استفاده از perl
زبان برنامه نویسی پرل نیز روش هایی را برای حذف خطوط تکراری از یک فایل استفاده میکند که این روش ها متنوع بوده و ما در این آموزش قصد داریم تنها به روش مرسوم و معمولی حذف داپلیکیت ها از یک فایل بپردازیم:
1 |
lsc@arshatech:$ perl -ne 'print if ! $x{$_}++' fruits.txt |
علاوه بر روش بالا این دستور نیز با همان کاربرد قابل استفاده می باشد:
1 |
lsc@arshatech:$ perl -ne 'print unless $a{$_}++' fruits.txt |
اگر شما هنگام اجرای دستور از سوئیچ ‘i-‘ استفاده کنیم خروجی دستور مستقیم در فایل مورد نظر ذخیره میشود که این امر میتواند موجب از بین رفتن فایل اصلی شود. اما شما میتوانید از سوئیچ ‘i.back-‘ به جهت اعمال تغییرات در فایل اصلی نیز استفاده کنید با این تفاوت که فایل اصلی از بین نرفته و تحت عنوان fruits.txt.back برای شما در همان مسیر ذخیره میشود. این روش میتواند روش مطمان تری جهت اعمال تغییر بر روی فایل اصلی به حساب بیاید.
استفاده از ruby
زبان برنامه نویسی ruby نیز یکی از زبان های بسیار قوی بوده که امروزه مورد استفاده های فراوانی دارد. برای حذف خطوط تکراری از یک فایل با استفاده از این زبان میتوان به صورت زیر عمل کرد:
1 |
lsc@arshatech:$ ruby -00 -ne 'puts $_.split("\n").uniq' fruits.txt |