খালি লাইন রাখার সময় কীভাবে ডাব্লিকেট লাইনগুলি মুছে ফেলা যায়?


13

নীচে awkকমান্ড সব ডুপ্লিকেট লাইন সরিয়ে ফেলা হবে এখানে ব্যাখ্যা :

awk '!seen[$0]++'

যদি পাঠ্যে খালি লাইন থাকে তবে একটি খালি লাইন বাদে সমস্ত মুছে ফেলা হবে।

আমি কীভাবে সমস্ত খালি লাইনগুলি কেবল খালি খালি নকল লাইনগুলি মুছে ফেলতে awkপারি? দয়া করে একটি সংক্ষিপ্ত ব্যাখ্যাও অন্তর্ভুক্ত করুন।

উত্তর:


28

আর একটি বিকল্প চেক করা হয় NF, যেমন:

awk '!NF || !seen[$0]++'

11

বিকল্পভাবে

awk '!/./ || !seen[$0]++' file

মূল কৌশলটি একই, মিশুক অ্যারেতে seen[$0]++একটি প্রবেশ তৈরি করে seenযার মূলটি বর্তমান লাইন ( $0)। সুতরাং, !seen[$0]++এই লাইনটি ইতিমধ্যে দেখা গেলে এটি মিথ্যা হবে। /./চেক করা আছে কিনা লাইন কোনো অ-ফাঁকা অক্ষর রয়েছে, তাই !/./অ ফাঁকা রেখা মেলে। || !seen[$0]++এটির সাথে একত্রিত হয়ে খালিগুলি বাদে সমস্ত সদৃশ লাইন উপেক্ষা করবে এবং বাকিগুলি মুদ্রণ করবে।


আমি মনে করি এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। ব্যাখ্যার জন্য +1!
এসএস অ্যান ২

5
awk '/^[[:blank:]]*$/ { print; next; }; !seen[$0]++'

আপনাকে যা করতে হবে তা হ'ল প্রথমে একটি খালি (সত্যিই খালি বা খালি) লাইন পরীক্ষা করা।


5

এখানে awk@ থোরের উত্তরের মতো আরও একটি সমাধান রয়েছে, কম সংক্ষিপ্ত তবে আরও দক্ষ:

awk '!NF {print;next}; !($0 in a) {a[$0];print}' file

a[$0]এটির সাথে আমরা কেবল যাচাই করে থাকি কি নেই। যদি তা না হয় তবে এটি আরম্ভ করে মুদ্রণ করুন। এই ক্ষেত্রে, আমাদের কোনও রেফারেন্স, অ্যাসাইনমেন্ট নেই a[$0]যদি এটি বিদ্যমান থাকে।


আমার 288-লাইনের পরীক্ষার ফাইলের সাথে আমি কোনও উল্লেখযোগ্য সময়ের পার্থক্য পরিমাপ করিনি। তবে, আপনার কোড অবশ্যই সর্বাধিক পঠনযোগ্য হওয়ার জন্য পুরষ্কারটি ধারণ করে।
সার্জ Stroobandt
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.