ইউনিক্স শেল স্ক্রিপ্টের একটি তালিকা থেকে অনন্য বা স্বতন্ত্র মান নির্বাচন করুন


238

আমার কাছে একটি কেএসএস স্ক্রিপ্ট রয়েছে যা মানগুলির একটি দীর্ঘ তালিকা দেয়, নতুন লাইন পৃথক হয় এবং আমি কেবল অনন্য / স্বতন্ত্র মান দেখতে চাই। এটা কি সম্ভব?

উদাহরণস্বরূপ, বলুন যে আমার আউটপুটটি কোনও ডিরেক্টরিতে ফাইল প্রত্যয় হয়:

tar
gz
java
gz
java
tar
class
class

আমি একটি তালিকা দেখতে চাই:

tar
gz
java
class

উত্তর:


432

আপনি অ্যাপ্লিকেশন uniqএবং sortঅ্যাপ্লিকেশন তাকান করতে পারেন ।

./yourscript.ksh | সাজানো | uniq

(এফওয়াইআই, হ্যাঁ, এই কমান্ড লাইনে বাছাই করা প্রয়োজনীয়, uniqকেবলমাত্র একে অপরের পরে থাকা ডুপ্লিকেট লাইনগুলি স্ট্রিপ করে)

সম্পাদনা করুন:

এর কমান্ডলাইন বিকল্পগুলির সাথে সম্পর্কিত হিসাবে অ্যারন ডিজুল্লা যা পোস্ট করেছেন তার বিপরীতে uniq:

নিম্নলিখিত ইনপুট দেওয়া হয়েছে:

শ্রেণী
বয়াম
বয়াম
বয়াম
বিন
বিন
জাভা

uniq সমস্ত লাইন ঠিক একবার আউটপুট হবে:

শ্রেণী
বয়াম
বিন
জাভা

uniq -d একাধিকবার প্রদর্শিত সমস্ত লাইন আউটপুট আউট করবে এবং এটি সেগুলি একবার মুদ্রণ করবে:

বয়াম
বিন

uniq -u একবারে প্রদর্শিত সমস্ত লাইন আউটপুট আউট করবে এবং এটি একবার মুদ্রণ করবে:

শ্রেণী
জাভা

2
প্রয়াতদের জন্য কেবল একটি এফওয়াইআই: @ অ্যারোনডিগুল্লার উত্তরটি তখন থেকেই সংশোধন করা হয়েছে।
mklement0

2
খুব ভাল পয়েন্ট এই কমান্ড লাইনে এই `বাছাই করা প্রয়োজনীয়, ইউনিক কেবল অনুলিপি লাইনগুলি একে অপরের পরে অবিলম্বে ফেলা - যা আমি সবে শিখেছি !!
হ্যাট্রিকএনজেড

4
জিএনইউতে অনন্য মূল্য দেওয়ার জন্য sortএকটি -uসংস্করণ রয়েছে ।
আর্থার 2e5

আমি বুঝতে পেরেছি যে uniqসীমগুলি কেবল সংলগ্ন রেখাগুলি (কমপক্ষে ডিফল্ট হিসাবে) প্রক্রিয়া করতে পারে যার অর্থ একটি sortখাওয়ানোর আগে ইনপুট করতে পারে uniq
স্টাফেন

85
./script.sh | sort -u

এটি মনোক্সাইডের উত্তর হিসাবে একই , তবে আরও খানিকটা সংক্ষিপ্ত।


6
আপনি বিনয়ী হচ্ছেন: আপনার সমাধানটি আরও ভাল সম্পাদন করবে (সম্ভবত কেবলমাত্র বড় ডেটা সেট সহ লক্ষণীয়)।
mklement0

আমি মনে করি ... | sort | uniqএটির চেয়ে আরও বেশি দক্ষ হওয়া উচিত কারণ এটি একটি শটে সঞ্চালিত হয়
অ্যাড্রিয়ান আন্তুনেজ

10

বৃহত্তর ডেটা সেটের জন্য যেখানে বাছাই পছন্দসই নয়, আপনি নিম্নলিখিত পার্ল স্ক্রিপ্টটিও ব্যবহার করতে পারেন:

./yourscript.ksh | perl -ne 'if (!defined $x{$_}) { print $_; $x{$_} = 1; }'

এটি মূলত প্রতিটি লাইন আউটপুটকে মনে রাখে যাতে এটি আবার আউটপুট না করে।

" sort | uniq" সমাধানের উপর এটির সুবিধা রয়েছে যাতে সামনে কোনও সাজানোর প্রয়োজন নেই required


2
মনে রাখবেন যে খুব বড় ফাইল বাছাই করা বাছাইয়ের সাথে প্রতি ইস্যু নয়; এটি উপলব্ধ র‌্যাম + স্ব্যাপের চেয়ে বড় আকারের ফাইলগুলি বাছাই করতে পারে। পার্ল, OTOH, ব্যর্থ হবে যদি সেখানে কেবলমাত্র কয়েকটি নকল থাকে।
অ্যারন দিগুল্লা

1
হ্যাঁ, এটি প্রত্যাশিত ডেটার উপর নির্ভর করে বাণিজ্য off অনেক ডুপ্লিকেট (কোনও ডিস্ক-ভিত্তিক স্টোরেজ প্রয়োজন নেই) সহ বিশাল ডেটাসেটের জন্য পার্ল আরও ভাল। কয়েকটি অনুলিপি সহ বিশাল ডেটাসেটে বাছাই করা (এবং ডিস্ক স্টোরেজ) ব্যবহার করা উচিত। ছোট ডেটাসেটগুলি ব্যবহার করতে পারে। ব্যক্তিগতভাবে, আমি প্রথমে পার্ল চেষ্টা করেছিলাম, যদি এটি ব্যর্থ হয় তবে সাজানোর জন্য স্যুইচ করুন।
paxdiablo

যেহেতু ডিস্কে অদলবদল করতে হয় তা বাছাই কেবল আপনাকে একটি সুবিধা দেয়।
প্যাক্সিডিয়াবলো

5
এটি দুর্দান্ত যখন আমি প্রতিটি লাইনের প্রথম উপস্থিতি চাই। বাছাই করলে তা ভেঙে যায়।
ব্লু

10

সঙ্গে zsh আপনি এটা করতে পারেন:

% cat infile 
tar
more than one word
gz
java
gz
java
tar
class
class
zsh-5.0.0[t]% print -l "${(fu)$(<infile)}"
tar
more than one word
gz
java
class

অথবা আপনি AWK ব্যবহার করতে পারেন:

% awk '!_[$0]++' infile    
tar
more than one word
gz
java
class

2
চতুর সমাধান যা ইনপুটটি বাছাই করে না। ক্যাভেটস: অত্যন্ত-চতুর-তবে-ক্রিপ্টিক awkসমাধান ( একটি ব্যাখ্যার জন্য স্ট্যাকওভারফ্লো.com/a/21200722/45375 দেখুন ) যতক্ষণ না স্বতন্ত্র রেখাগুলির সংখ্যা যথেষ্ট ছোট হয় ততক্ষণ বড় ফাইলগুলির সাথে কাজ করবে (অনন্য লাইনগুলিকে স্মৃতিতে রাখা হয়েছে) )। zshসমাধান মেমরিতে সম্পূর্ণ ফাইল সার্চ প্রথম, বড় ফাইল সঙ্গে একটি বিকল্প হতে পারে না। এছাড়াও, লিখিত হিসাবে, কেবল এমবেড থাকা ফাঁকা স্থান নয় এমন লাইনগুলি সঠিকভাবে পরিচালনা করা হয়; এটি ঠিক করতে, IFS=$'\n' read -d '' -r -A u <file; print -l ${(u)u}পরিবর্তে ব্যবহার করুন।
mklement0

সঠিক। বা:(IFS=$'\n' u=($(<infile)); print -l "${(u)u[@]}")
দিমিত্রে রাদৌলভ

1
ধন্যবাদ, এটি সহজ (ধরে নিলাম সাবসেলের বাইরে আপনার প্রয়োজনীয় ভেরিয়েবলগুলি সেট করার দরকার নেই) ধরে নেওয়া উচিত। আমি কৌতূহল বোধ করি যখন আপনাকে [@]অ্যারের সমস্ত উপাদানগুলির রেফারেন্স করার জন্য প্রত্যয়টির প্রয়োজন হয় - মনে হয় - কমপক্ষে সংস্করণ 5 হিসাবে - এটি ছাড়াই কাজ করে; বা আপনি কেবল এটি স্পষ্টতার জন্য যুক্ত করেছেন?
mklement0

1
@ এমকিলেটমেন্ট 0, আপনি ঠিক বলেছেন! পোস্টটি লেখার সময় আমি এটির কথা ভাবিনি। আসলে, এটি পর্যাপ্ত হওয়া উচিত:print -l "${(fu)$(<infile)}"
দিমিত্রে রাদৌলভ

1
চমত্কার, আপনার পোস্ট আপডেট করার জন্য ধন্যবাদ - আমি awkনমুনা আউটপুট ঠিক করার স্বাধীনতা গ্রহণ করেছি ।
mklement0

9

sortএবং মাধ্যমে পাইপ uniq। এটি সমস্ত সদৃশ অপসারণ করে।

uniq -dকেবল অনুলিপি uniq -uদেয়, কেবল অনন্য দেয় (স্ট্রিপস নকল)।


এর চেহারা অনুসারে প্রথমে বাছাই করতে হবে
ব্র্যাবস্টার 10

1
হ্যাঁ তুমি কর. বা আরও সঠিকভাবে, আপনাকে সমস্ত সদৃশ লাইন একসাথে গোষ্ঠীভুক্ত করতে হবে। বাছাই যদিও সংজ্ঞা অনুসারে এটি করে;)
ম্যাথু শার্লে

এছাড়াও, uniq -uডিফল্ট আচরণ নয় (বিশদগুলির জন্য আমার উত্তরের সম্পাদনা দেখুন)
ম্যাথু শিারলে

7

AWK দিয়ে আপনি করতে পারেন, আমি এটি সাজানোর চেয়ে দ্রুত খুঁজে পাই

 ./yourscript.ksh | awk '!a[$0]++'

কাজটি করার জন্য এটি অবশ্যই আমার প্রিয় উপায়, অনেক ধন্যবাদ! বিশেষত বড় ফাইলগুলির জন্য, সাজানো | ইউনিট-সমাধানগুলি সম্ভবত আপনি চান তা নয়।
স্মিটজি

1

অনন্য, অনুরোধ অনুসারে, (তবে সাজানো নয়);
~ 70 টিরও কম উপাদানের (সময়ের সাথে পরীক্ষিত হিসাবে) কম সিস্টেম সংস্থান ব্যবহার করে;
স্টিডিনের কাছ থেকে ইনপুট নেওয়ার জন্য লিখিত,
(বা অন্য স্ক্রিপ্টে সংশোধন এবং অন্তর্ভুক্ত):
(বাশ)

bag2set () {
    # Reduce a_bag to a_set.
    local -i i j n=${#a_bag[@]}
    for ((i=0; i < n; i++)); do
        if [[ -n ${a_bag[i]} ]]; then
            a_set[i]=${a_bag[i]}
            a_bag[i]=$'\0'
            for ((j=i+1; j < n; j++)); do
                [[ ${a_set[i]} == ${a_bag[j]} ]] && a_bag[j]=$'\0'
            done
        fi
    done
}
declare -a a_bag=() a_set=()
stdin="$(</dev/stdin)"
declare -i i=0
for e in $stdin; do
    a_bag[i]=$e
    i=$i+1
done
bag2set
echo "${a_set[@]}"

0

একটি ফাইলে নন-অনুলিপি প্রবেশের জন্য আমি আরও ভাল টিপস পেয়েছি

awk '$0 != x ":FOO" && NR>1 {print x} {x=$0} END {print}' file_name | uniq -f1 -u
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.