শেল স্ক্রিপ্ট ব্যবহার করে স্ট্রিং থেকে সমস্ত সদৃশ শব্দটি সরান


12

আমার মতো স্ট্রিং আছে

"aaa,aaa,aaa,bbb,bbb,ccc,bbb,ccc"

আমি স্ট্রিং থেকে সদৃশ শব্দটি সরিয়ে ফেলতে চাই তবে আউটপুট কেমন হবে

"aaa,bbb,ccc"

আমি এই কোড উত্স চেষ্টা করেছিলাম

$ echo "zebra ant spider spider ant zebra ant" | xargs -n1 | sort -u | xargs

এটি একই মান সহ সূক্ষ্মভাবে কাজ করছে, তবে যখন আমি আমার পরিবর্তনশীল মান দেব তখন এটি সমস্ত নকল শব্দও প্রদর্শন করছে।

আমি কীভাবে সদৃশ মানটি সরিয়ে ফেলতে পারি।

হালনাগাদ

ব্যবহারকারী যদি একই হয় তবে আমার প্রশ্নটি সমস্ত সম্পর্কিত মানকে একটি স্ট্রিংয়ে যুক্ত করছে is আমার কাছে এই জাতীয় ডেটা রয়েছে ->

   user name    | colour
    AAA         | red
    AAA         | black
    BBB         | red
    BBB         | blue
    AAA         | blue
    AAA         | red
    CCC         | red
    CCC         | red
    AAA         | green
    AAA         | red
    AAA         | black
    BBB         | red
    BBB         | blue
    AAA         | blue
    AAA         | red
    CCC         | red
    CCC         | red
    AAA         | green

কোডিংয়ে আমি সমস্ত স্বতন্ত্র ব্যবহারকারীর আনয়ন করি তারপরে আমি সাফল্যের সাথে রঙের স্ট্রিং কনটানেট করি that এজন্য আমি কোড ব্যবহার করছি -

while read the records 

    if [ "$c" == "" ]; then  #$c I defined global
        c="$colour1"
    else
        c="$c,$colour1" 
    fi

আমি যখন এই $ সি ভেরিয়েবলটি মুদ্রণ করি তখন আমি আউটপুট পাই (ব্যবহারকারী এএএ জন্য)

"red,black,blue,red,green,red,black,blue,red,green,"

আমি সদৃশ রঙ মুছে ফেলতে চাই hen

"red,black,blue,green"

এই পছন্দসই আউটপুট জন্য আমি কোড উপরে ব্যবহার

 echo "zebra ant spider spider ant zebra ant" | xargs -n1 | sort -u | xargs

তবে এটি সদৃশ মান সহ আউটপুট প্রদর্শন করছে ike

"লাল, কালো, নীল, লাল, সবুজ, লাল, কালো, নীল, লাল, সবুজ," ধন্যবাদ


3
আপনি যা ব্যবহার করছেন তাতে ভুল কি তা দয়া করে পরিষ্কার করুন। "আমি যখন আমার পরিবর্তনশীল মান দেই" আপনি কী বোঝাতে চেয়েছিলেন তা আমি বুঝতে পারি না। আপনি কি মূল্য দিতে? কোথায় ব্যর্থ হয়?
টেরডন

echo 'aaa aaa aaa bbb bbb ccc bbb ccc' | xargs -n1 | sort -u | xargsদেয় aaa bbb ccc.. যাতে আপনার ক্লান্ত এবং আউটপুটটি পেয়েছে এমন সঠিক কোডটি দেখাতে হবে .. ভেরিয়েবলের স্ট্রিং সহ:s='aaa aaa aaa bbb bbb ccc bbb ccc'; echo "$s" | xargs -n1 | sort -u | xargs
সুন্দীপ

স্ট্রিং মান ডায়নামিকভাবে আসে। এটি একই মান মুদ্রণ করছে (সদৃশ মান ধারণ করে)।
উর্বশী

1
হ্যাঁ, ব্যর্থ হয়েছে এমন কোডটি দেখান, অন্যথায় কীভাবে ভুল হতে পারে তা আমরা কীভাবে জানব?
সুন্দীপ

অর্ডার কি ব্যাপার?
জ্যাকব ভিলিজম

উত্তর:


12

আরও মজাদার জন্য, কেবল মজাদার জন্য:

$ a="aaa bbb aaa bbb ccc aaa ddd bbb ccc"
$ echo "$a" | awk '{for (i=1;i<=NF;i++) if (!a[$i]++) printf("%s%s",$i,FS)}{printf("\n")}'
aaa bbb ccc ddd 

যাইহোক, এমনকি আপনার সমাধান ভেরিয়েবলগুলির সাথে সূক্ষ্মভাবে কাজ করে:

$ b="zebra ant spider spider ant zebra ant" 
$ echo "$b" | xargs -n1 | sort -u | xargs
ant spider zebra

ঝরঝরে পন্থা আমাকে কেবলমাত্র সামঞ্জস্য করতে হয়েছিল তার %sপরিবর্তে ব্যবহার করা %s%s। কারণটি হ'ল আমি ফলাফলগুলির মধ্য দিয়ে লুপের জন্য চেষ্টা করছিলাম এবং দুটি সাদা স্পেস রিজেক্স ম্যাচগুলির সাথে কিছু চ্যালেঞ্জের কারণ হয়েছিল।
জেরেমি ক্যানফিল্ড 20'19

9

সাথে tr, sortএবংuniq

echo "zebra ant spider spider ant zebra ant" | tr ' ' '\n' | sort | uniq

অথবা

echo "zebra ant spider spider ant zebra ant" | tr ' ' '\n' | sort | uniq | xargs 

এক লাইন পেতে


আপনাকে | xargsআবার এক লাইনে আউটপুট যোগ দিতে যোগ করতে হবে
ফিলিপোস

4
বা ব্যবহার sort -u। বা এমনকি একটি awk '!u[$0]++
বেনোয়েট

2
@ বেনোত বাহ, আমি সম্পর্কে জানতাম না sort -u। আমি sort | uniqএই সমস্ত সময় ব্যবহার করা হয় । নষ্ট
কীট্রোকস


2

Gnu সহ sed:

sed ':s;s/\(\<\S*\>\)\(.*\)\<\1\>/\1\2/g;ts'

আপনি ;s/ */ /gপ্রজাতন্ত্রীয় স্থানগুলি সরাতে যুক্ত করতে পারেন।

এর মতো ক্রিয়াকলাপ: এই লাইনে কোনও শব্দ যদি দ্বিতীয়বার হয় তবে এটিকে সরিয়ে ফেলুন এবং আর কোনও প্রজাতন্ত্রের সন্ধান না পাওয়া পর্যন্ত শুরু করুন।


কি \<এবং \>?
someonewithpc

@ সুমোনউইথপিসি এগুলি কোনও চরিত্রের সাথে মেলে না, তবে সাবস্ট্রিংগুলিকে ম্যাচ হওয়া থেকে বিরত রাখতে একটি শব্দের শুরু এবং শেষ।
ফিলিপোস

ভাল লাগল, তবে কি সেই বহনযোগ্য? এছাড়াও, শব্দগুলি সাদা জায়গার দ্বারা পৃথক করা হয় না? শব্দের সমাপ্তির পরে হোয়াইটস্পেস না মেলাতে অপ্রয়োজনীয় মনে হয়।
someonewithpc

1
@someonewithpc না, এটা মান নয়, কেন যে আমি লিখেছি GNU sed । দুর্দান্ত অংশটি হ'ল আপনাকে পৃথক প্রথম এবং শেষ স্ট্রিংটি আলাদাভাবে পরিচালনা করতে হবে না
ফিলিপোস

2
perl -lane '$,=$";print grep { ! $h{$_}++ } @F'

2

বাধ্যতামূলক বিশ্রী সমাধান:

$ echo "ant zebra ant spider spider ant zebra ant" | 
   awk -vRS=" " -vORS=" " '!a[$1] {a[$1]++} END{ for (x in a) print x;  } ' ; echo
zebra ant spider 

( echoনতুন লাইনের জন্য ফাইনাল আছে)


আরও একবারের জন্য! আমি কেবল মজাদার জন্য একটি অজানা সমাধানও বুলিয়েছিলাম। অ্যারে কীগুলিতে এলোমেলোভাবে বিভ্রান্ত হওয়ার কারণে এন্ড বিভাগে এলোমেলো ক্রমে মুদ্রিত হওয়ার সামান্য সম্ভাবনা রয়েছে is
জর্জি ভ্যাসিলিউ

হ্যাঁ, এগুলি মূলত এলোমেলো ক্রমে মুদ্রিত হবে। sortসমাধান মূল অর্ডার পারেন, যদিও রাখা হয় না।
ইল্কাচ্চু

হ্যাঁ, ভাল পয়েন্ট! এমনকি ইনপুট থেকে আলাদা ক্রমে প্রিন্টগুলি সাজান।
জর্জ ভ্যাসিলিউ

1
@ilkkachu আসলে ইনপুটটি শেষ হওয়ার জন্য আমাদের অপেক্ষা করার দরকার নেই। আপনার কোডটিতে সামান্য পরিবর্তন করে মুদ্রণ করা বা না প্রিন্ট করার সিদ্ধান্ত নিতে পারি: awk -vRS=" " -vORS=" " '!a[$1]++ {print $1}' ; echoএটি অর্ডার সংরক্ষণ করে।

1

পাইথন

বিকল্প 1

#!/usr/bin/env python
# get_unique_words.py

import sys

l = []
for w in sys.argv[1].split(','):
  if w not in l:
    l += [ w ]
print ','.join(l)

এক্সিকিউটেবল করুন, তারপরে বাশ থেকে কল করুন:

$ ./get_unique_words.py "aaa,aaa,aaa,bbb,bbb,ccc,bbb,ccc"
aaa,bbb,ccc

বা আপনি এটিকে বাশ ফাংশন হিসাবে বাস্তবায়ন করতে পারেন তবে সিনট্যাক্সটি অগোছালো।

get_unique_words(){
  python -c "
l = []
for w in '$1'.split(','):
  if w not in l:
    l += [ w ]
print ','.join(l)"
}

বিকল্প 2

প্রয়োজন হলে এই বিকল্পটি ওয়ান-লাইনারে পরিণত হতে পারে:

#!/usr/bin/env python
# get_unique_words.py

import sys

s_in = sys.argv[1]
l_in = s_in.split(',') # Turn string into a list.
set_out = set(l_in) # Turning a list into a set removes duplicates items.
s_out = ','.join(set_out) 
print s_out

বাশে:

get_unique_words(){
  python -c "print ','.join(set('$1'.split(',')))"
}

0
cat filename | awk '{ delete a; for (i=1; i<=NF; i++) a[$i]++; n=asorti(a, b); for (i=1; i<=n; i++) printf b[i]" "; print "" }' > newfile

আমি এটি পাই না
পিয়ের.ভ্রিয়েন্স

1
আপনার কোড ব্যাখ্যার অভাব আছে। কোনও ব্যাখ্যা ছাড়াই, যা ঘটছে তা অনুসরণ করা কঠিন। আপনি যে ডেটা ভুল বলে মনে করেন সে সম্পর্কে অনুমানগুলিও করেছেন বলে মনে হয় (সাদা ক্ষেত্র-সীমিত ক্ষেত্রগুলি) এবং নির্দিষ্ট awkপ্রয়োগকরণটি ব্যবহৃত হচ্ছে ( asorti()এটি কোনও স্ট্যান্ডার্ড awkফাংশন নয়)।
কুসালানন্দ

0

ফাইলটিতে মূল সারণী তথ্য ব্যবহার করে file:

sed '1d' file | sort -u |
awk '{ color[$1] = ( color[$1] == "" ? $3 : color[$1] "," $3 ) }
     END { for (user in color) print user, color[user] }'

এটি উত্পন্ন

CCC red
BBB blue,red
AAA black,blue,green,red

পাইপলাইনের তিনটি ধাপ:

  1. sedকমান্ড প্রথম লাইন যা হেডার, যা আমরা পাঠ করতে চাই না হয় সরিয়ে ফেলা হয়।
  2. sortকমান্ড আমাদের অনন্য লাইন দেয়। স্যাম্পল ডেটা sortদেখে মনে হচ্ছে

    AAA         | black
    AAA         | blue
    AAA         | green
    AAA         | red
    BBB         | blue
    BBB         | red
    CCC         | red
  3. awkকমান্ড এই তথ্য নেয় এবং অ্যারের মধ্যে প্রত্যেক ব্যবহারকারীর জন্য একটি কমা দ্বারা আলাদা করা স্ট্রিং উত্পাদন করে color(যেখানে ব্যবহারকারীর নাম অ্যারের মধ্যে চাবিকাঠি)। শেষে ( ENDব্লকের মধ্যে) সমস্ত সংগ্রহ করা ডেটা আউটপুট করা হয়।

-2
a="aaa aaa aaa bbb bbb ccc bbb ccc"
for item in $a
do
   echo $item
done | sort -u | (while read i; do ans="$ans $i"; done ; echo $ans)

আপনার কোডটি কীভাবে কাজ করে এবং আপনি কেন এবং এটি কী করেছিলেন সে সম্পর্কে দয়া করে একটি ব্যাখ্যা যুক্ত করুন।
xhienne
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.