खाली लाइनों को रखते हुए awk के साथ डुप्लिकेट लाइनों को कैसे हटाएं?


13

नीचे दिए गए awkआदेश के अनुसार सभी डुप्लिकेट लाइनों को हटा दिया गया है :

awk '!seen[$0]++'

यदि पाठ में रिक्त लाइनें हैं, तो सभी लेकिन एक खाली रेखा हटा दी जाएगी।

मैं केवल उपयोग करके सभी खाली-खाली डुप्लिकेट लाइनों को हटाते हुए सभी खाली लाइनों को कैसे रख सकता हूंawk ? कृपया, एक संक्षिप्त विवरण भी शामिल करें।

जवाबों:


28

एक अन्य विकल्प की जाँच करना है NF, जैसे:

awk '!NF || !seen[$0]++'

11

वैकल्पिक रूप से

awk '!/./ || !seen[$0]++' file

मुख्य चाल समान है, साहचर्य सरणी seen[$0]++में एक प्रविष्टि बनाता है seenजिसकी कुंजी वर्तमान रेखा ( $0) है। इसलिए, !seen[$0]++यह रेखा पहले से ही देखी गई है , तो गलत होगी। यह /./जाँच रहा है कि क्या लाइन में कोई गैर-रिक्त वर्ण हैं, इसलिए !/./गैर-रिक्त लाइनों से मेल खाता है। || !seen[$0]++इसके साथ संयुक्त खाली लोगों को छोड़कर सभी डुप्लिकेट लाइनों को अनदेखा करेगा और बाकी प्रिंट करेगा।


मुझे लगता है कि यह स्वीकृत उत्तर होना चाहिए था। स्पष्टीकरण के लिए +1!
एसएस ऐनी

5
awk '/^[[:blank:]]*$/ { print; next; }; !seen[$0]++'

आपको बस एक खाली (वास्तव में खाली या सिर्फ खाली) लाइन की जांच करनी है।


5

यहाँ एक और awkसमाधान है, @ थोर के उत्तर के समान, कम संक्षिप्त लेकिन अधिक कुशल:

awk '!NF {print;next}; !($0 in a) {a[$0];print}' file

इसके साथ, हम केवल जाँच करते हैं a[$0]कि मौजूद है या नहीं। अगर नहीं, तो इनिशियलाइज़ करें फिर प्रिंट करें। इस मामले में, हमारे पास कोई संदर्भ नहीं है, a[$0]यदि यह मौजूद है तो असाइनमेंट ।


मैंने अपनी 288-लाइन परीक्षण फ़ाइल के साथ कोई महत्वपूर्ण समय अंतर नहीं मापा। हालांकि, आपका कोड निश्चित रूप से सबसे पठनीय होने के लिए पुरस्कार को पकड़ता है।
सर्ज स्ट्रोबंड्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.