मैंने sed
इस प्रश्न को पोस्ट करने के लंबे समय बाद जवाब नहीं दिया; sed
अब तक किसी और ने यहां उपयोग नहीं किया है:
sed '$!N;/^\(.*\)\n\1$/d;P;D'
अधिक सामान्य समस्या के साथ थोड़ा सा खेल (तीन के सेट में लाइनों को हटाने के बारे में क्या? या चार? या पांच?) निम्नलिखित एक्स्टेंसिबल समाधान प्रदान करते हैं:
sed -e ':top' -e '$!{/\n/!{N;b top' -e '};};/^\(.*\)\n\1$/d;P;D' temp
लाइनों के त्रिभुज निकालने के लिए विस्तारित:
sed -e ':top' -e '$!{/\n.*\n/!{N;b top' -e '};};/^\(.*\)\n\1\n\1$/d;P;D' temp
या लाइनों के quads निकालने के लिए:
sed -e ':top' -e '$!{/\n.*\n.*\n/!{N;b top' -e '};};/^\(.*\)\n\1\n\1\n\1$/d;P;D' temp
sed
अधिकांश अन्य विकल्पों पर एक अतिरिक्त लाभ है, जो एक स्ट्रीम में सही मायने में संचालित करने की क्षमता है, डुप्लिकेट के लिए जाँच की जाने वाली लाइनों की वास्तविक संख्या से अधिक मेमोरी स्टोरेज की आवश्यकता नहीं है।
जैसा कि कॉउन्ग्लम ने टिप्पणियों में बताया , सी को लोकेल सेट करना मल्टी-बाइट वर्णों को ठीक से हटाने के लिए विफलताओं से बचने के लिए आवश्यक है। तो ऊपर दिए गए आदेश बन जाते हैं:
LC_ALL=C sed '$!N;/^\(.*\)\n\1$/d;P;D' temp
LC_ALL=C sed -e ':top' -e '$!{/\n/!{N;b top' -e '};};/^\(.*\)\n\1$/d;P;D' temp
LC_ALL=C sed -e ':top' -e '$!{/\n.*\n/!{N;b top' -e '};};/^\(.*\)\n\1\n\1$/d;P;D' temp
# Etc.
C
, अन्यथा मल्टी-बाइट लोकेल में, उस लोकेल में अमान्य वर्ण कमांड विफल हो सकता है।