सॉर्ट करने के लिए शब्दों को सॉर्ट करें -u एवॉइडिंग डुप्लिकेट के साथ


1

मेरे पास 2 txt फ़ाइल है जिसे one.txt कहा जाता है: डुप्लिकेट के साथ:

yesterday
yesterday
today
today
tomorrow
tomorrow

और दूसरा txt जिसे डुप्लिकेट के साथ two.txt कहा जाता है:

mike
mike
paul
paul
tomorrow
tomorrow

कमांड का उपयोग करके sort -u one.txt > total.txtमेरे पास आउटपुट फाइल हो सकती है:

today
tomorrow
yesterday

इसलिए मैं sort -u two.txt >> total.txtदूसरी फ़ाइल को उसी आउटपुट फ़ाइल में जोड़ने के लिए उपयोग करता हूं और मेरे पास परिणाम है:

today
tomorrow
yesterday
mike
paul
tomorrow

मेरे पास "कल" ​​शब्द से दोगुना है। इससे कैसे बचा जाए?

sed 's/[[:space:]]+$//' one.txt two.txt | sort -u total.txt

लगता है कि समाधान है, लेकिन समस्या हर बार जब मैं एक और शब्द सूची में जोड़ना चाहता हूं, तो यह दिखाई देता है:

sed 's/[[:space:]]+$//' three.txt | sort -u total.txt


समाधान का सुझाव देने के लिए धन्यवाद @ पीटर.ओ: <कोड> sed 's / [[: space:]] \ + $ //' male.txt female.txt | सॉर्ट -u </ code> यहाँ: [ unix.stackexchange.com/questions/198770/…
फ्रांसेस्को

जवाबों:


1

आपके पास करने को तैयार हैं total.txt(साथ सॉर्ट क्रम में mikeऔर paulशुरुआत में), तो आपको निम्न में से किसी कर सकते हैं:

  • sort -u one.txt two.txt > total.txt या
  • sort -u total.txt two.txt -o total.txt

यदि आपको ऑर्डर बनाए रखने की जरूरत है ( one.txtपहले छांटे गए कंटेंट , उसके बाद सॉर्ट की गई सामग्री को two.txt छोड़कर जो लाइनों में थे one.txt), तो

  • sort -u two.txt | awk '!seen[$0]++' total.txt - > temp.txt; mv temp.txt total.txt

के बराबर है

  • (cat total.txt; sort -u two.txt) | awk '!seen[$0]++' > temp.txt; mv temp.txt total.txt

यानी, total.txt (जो पहले से छांटे और कटे हुए हैं) की सामग्री ले लें , छँटाई की गई छंटनी की गई सामग्री के साथ अनुसरण करें two.txt, और पहले से दस्तावेज़ित awk कमांड के माध्यम से उन्हें एक अनसुनी फ़ाइल को हटाने के लिए चलाएं ।


आपको awk '!seen[$0]++'कमांड से परिचित होना चाहिए ; आपने कल पूछे गए प्रश्न में इसका हवाला दिया
जी-मैन

0

आप इनपुट फ़ाइल को सुरक्षित रूप से अधिलेखित करने के लिए sedप्लस spongeका उपयोग कर सकते हैं । यह आपको totalएक इनपुट फ़ाइल के रूप में उपयोग करने की अनुमति देता है - spongeपैकेज moreutils(उबंटू) में उपलब्ध है ।

स्पंज मानक इनपुट पढ़ता है और इसे निर्दिष्ट फ़ाइल पर लिखता है। शेल पुनर्निर्देशित के विपरीत, स्पंज आउटपुट फ़ाइल खोलने से पहले अपने सभी इनपुट को भिगो देता है। यह पाइप ‐ लाइनों के निर्माण की अनुमति देता है जो उसी फ़ाइल से पढ़ता और लिखता है।

file[0]=total; [[ -f "$file" ]] || touch "$file"
file[1]=any
file[2]=number 
file[3]=of
file[4]=files
sed 's/[[:space:]]\+$//' "${file[@]}" | sort -u | sponge "$file"

ध्यान दें कि बैश वर एरे में पहला आइटम ${file[0]}, संदर्भित किया जा सकता है और इसका मान बिना इंडेक्स का उपयोग किए बिना सेट किया जा सकता है, अर्थात। $file(जैसा कि मैंने ऊपर किया है - इसके टाइप करना आसान है)। बनाता है कि वह पहले से बाहर निकलने नहीं देता है। आप किसी भी संख्या में फ़ाइलों का उपयोग कर सकते हैं - बस तदनुसार सूचकांक संख्या बढ़ाएँ। आप फ़ाइलों के एक ही सेट को फिर से चला सकते हैं, और पहले की तरह ही सामग्री बनी रहेगी (फ़ाइलों के उस सेट के लिए)
[[ -f total ]] || touch totaltotal

total

इसके बजाय spongeआप एक अस्थायी फ़ाइल के लिए उत्पादन कर सकते हैं, तो totalउस अस्थायी फ़ाइल के साथ बदलें (लेकिन मुझे पसंद है sponge)


ओपी wiould समझ में क्यों मैं इस्तेमाल किया है sed, लेकिन इस जवाब के सामान्य दर्शक नहीं हो सकता है - जब तक वे अपने पिछले सवाल / जवाब के बारे में अपनी टिप्पणी में ओपी के संदर्भ का पालन किया। कारण यह है कि उनकी कुछ इनपुट डेटा लाइनों में व्हॉट्सएप का स्थान है।
पीटर।

धन्यवाद @ पीटर। मैंने पाया है <code> स्पंज </ code> बहुत उपयोगी है। मुझे यह भी पता चला है कि <code> sed -i </ code> भी इनपुट फ़ाइल को फिर से लिख सकता है
फ्रांसेस्को मोंटोवानी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.