खाली लाइनों को रखते हुए 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.