अगली पंक्ति समान होने पर लाइन हटाएं


15

मैं किस sed / awk कमांड का उपयोग कर सकता हूं? बस sort -uसभी उदाहरणों को हटा देंगे

इनपुट:

abc
abc
def
abc
abc
def

अपेक्षित उत्पादन:

abc
def
abc
def

जवाबों:


36

यही uniqमानक मानक के लिए है।

uniq your-file

ध्यान दें कि uniqजीएनयू जैसे कुछ कार्यान्वयन uniqआपको लाइनों के अनुक्रम का पहला हिस्सा देंगे जो बाइट-टू-बाइट समान (जहां या रिटर्न 0) के विपरीत है (जहां रिटर्न 0) उसी के अनुरूप है । कार्यान्वयन की परवाह किए बिना बाइट तुलना करने के लिए बाध्य करने के लिए , आप स्थानीय को इसके साथ मजबूर कर सकते हैं :strcoll()memcmp()strcmp()uniqC

LC_ALL=C uniq your-file

7

विम इसे अच्छी तरह से प्राप्त कर सकते हैं:

:g/\v^(.*\n)\1/d

या यदि आप इसके बजाय कमांड लाइन टूल के रूप में विम का उपयोग करते हैं, तो आप ऐसा कर सकते हैं

vim file -c "g/\v^(.*\n)\1/d" -c "wq"

इस तरह से आपको बाद में बाहर निकलने के साथ कुश्ती करने की ज़रूरत नहीं है;)

स्पष्टीकरण:

:g/

इस रेगेक्स से मेल खाने वाली सभी लाइनों पर ...

\v^(.*\n)\1

किसी भी लाइन के बाद खुद ...

/d

d elete कमांड चलाएं (करंट लाइन हटाएं)। -c "wq"परिवर्तन और बाहर निकलने को बचाने के लिए है।


ध्यान दें कि कम से कम 8.1.2112 के साथ, यह डुप्लिकेट लाइनों के लिए काम नहीं करता है जो फ़ाइल की अंतिम दो लाइनें हैं। इसके अलावा, यह केवल 3 डुप्लिकेट लाइनों के अनुक्रम से एक डुप्लिकेट को निकालता है।
स्टीफन चेजलस

1
@ स्टीफनचैजेलस को छोड़कर हमें वर्तमान में 3-लाइन मामले में वांछित व्यवहार के लिए विनिर्देशन की कमी है - मैं दोनों तरीकों से वांछित व्यवहार देख सकता था।
डी। बेन नोबल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.