उन सभी लाइनों को हटा दें जिनमें सीमांकक से पहले n वर्ण नहीं हैं


11

मेरे पास बहुत लंबी पाठ फ़ाइल है ( यहाँ से ) जिसमें 6 हेक्साडेसिमल वर्ण होने चाहिए फिर एक 'ब्रेक' (जो एक वर्ण के रूप में प्रकट होता है और नीचे दिए गए कोड मार्कडाउन में ठीक से दिखाई नहीं देता है) कुछ शब्दों के बाद:

00107B  Cisco Systems, Inc
00906D  Cisco Systems, Inc
0090BF  Cisco Systems, Inc
5080    Cisco Systems, Inc
0E+00   ASUSTek COMPUTER INC.
000C6E  ASUSTek COMPUTER INC.
001BFC  ASUSTek COMPUTER INC.
001E8C  ASUSTek COMPUTER INC.
0015F2  ASUSTek COMPUTER INC.
2354    ASUSTek COMPUTER INC.
001FC6  ASUSTek COMPUTER INC.
60182E  ShenZhen Protruly Electronic Ltd co.
F4CFE2  Cisco Systems, Inc
501CBF  Cisco Systems, Inc

मैंने कुछ तलाश की है और कुछ ऐसा नहीं देख सकता जो इस स्थिति में काम करेगा। मेरा प्रश्न है, मैं इस पाठ फ़ाइल की सभी पंक्तियों को हटाने के लिए grep/ sed/ awk/ perlका उपयोग कैसे कर सकता हूं जो ठीक 6 हेक्साडेसिमल वर्णों से शुरू नहीं होती हैं और फिर एक 'ब्रेक'?

पुनश्च बोनस अंक के लिए, हेक्स वर्णों के अनुसार वर्णानुक्रम में और संख्यात्मक रूप से फ़ाइल को सॉर्ट करने का सबसे अच्छा तरीका क्या है (यानी 000000-> FFFFFF)? क्या मुझे सिर्फ उपयोग करना चाहिए sort?

जवाबों:


13
$ awk '$1 ~ /^[[:xdigit:]]{6}$/' file
00107B  Cisco Systems, Inc
00906D  Cisco Systems, Inc
0090BF  Cisco Systems, Inc
000C6E  ASUSTek COMPUTER INC.
001BFC  ASUSTek COMPUTER INC.
001E8C  ASUSTek COMPUTER INC.
0015F2  ASUSTek COMPUTER INC.
001FC6  ASUSTek COMPUTER INC.
60182E  ShenZhen Protruly Electronic Ltd co.
F4CFE2  Cisco Systems, Inc
501CBF  Cisco Systems, Inc

यह awkउन लाइनों को निकालने के लिए उपयोग करता है जिनमें पहले क्षेत्र में ठीक छह हेक्साडेसिमल अंक होते हैं। [[:xdigit:]]पैटर्न एक हेक्साडेसिमल अंक से मेल खाता है, और {6}उनमें से छह की आवश्यकता है। साथ में ^और $क्रमशः क्षेत्र के शुरू और अंत के लिए एंकरिंग के साथ , यह केवल वांछित लाइनों पर मेल खाएगा।

एक नए नाम के तहत इसे बचाने के लिए कुछ फ़ाइल पर रीडायरेक्ट करें।

ध्यान दें कि यह GNU awk(आमतौर पर लिनक्स पर पाया जाता है) के साथ काम करता है , लेकिन awkउदाहरण के लिए OpenBSD, या के साथ नहीं mawk


इसके साथ एक समान दृष्टिकोण sed:

$ sed -n '/^[[:xdigit:]]\{6\}\>/p' file
00107B  Cisco Systems, Inc
00906D  Cisco Systems, Inc
0090BF  Cisco Systems, Inc
000C6E  ASUSTek COMPUTER INC.
001BFC  ASUSTek COMPUTER INC.
001E8C  ASUSTek COMPUTER INC.
0015F2  ASUSTek COMPUTER INC.
001FC6  ASUSTek COMPUTER INC.
60182E  ShenZhen Protruly Electronic Ltd co.
F4CFE2  Cisco Systems, Inc
501CBF  Cisco Systems, Inc

इस अभिव्यक्ति में, \>हेक्साडेसिमल संख्या के अंत से मेल खाने के लिए उपयोग किया जाता है। यह सुनिश्चित करता है कि अधिक संख्या का मिलान नहीं हो रहा है। \>पैटर्न एक से मेल खाता है शब्द सीमा , यानी एक शब्द चरित्र और एक गैर शब्द चरित्र के बीच शून्य चौड़ाई अंतरिक्ष।


परिणामी डेटा को सॉर्ट करने के लिए, परिणाम गर्त को पाइप करें sort, या sort -fयदि आपका हेक्साडेसिमल नंबर ऊपरी और निचले दोनों प्रकार के अक्षरों का उपयोग करता है


1
बिल्कुल सही आपका बहुत बहुत धन्यवाद। ठीक वही जो मेरे द्वारा खोजा जा रहा था!
रोक्को 13

8

और पूर्णता के लिए, आप इसे grep के साथ भी कर सकते हैं:

$ grep -E '^[[:xdigit:]]{6}\b' oui.txt 
00107B  Cisco Systems, Inc
00906D  Cisco Systems, Inc
0090BF  Cisco Systems, Inc
000C6E  ASUSTek COMPUTER INC.
001BFC  ASUSTek COMPUTER INC.
001E8C  ASUSTek COMPUTER INC.
0015F2  ASUSTek COMPUTER INC.
001FC6  ASUSTek COMPUTER INC.
60182E  ShenZhen Protruly Electronic Ltd co.
F4CFE2  Cisco Systems, Inc
501CBF  Cisco Systems, Inc
$ 

यह विस्तारित grep अभिव्यक्ति प्रत्येक पंक्ति की शुरुआत में ठीक 6 हेक्स अंकों की खोज करती है, इसके बाद तुरंत एक गैर-व्हाट्सएप-टू-व्हाट्सएप सीमा ( \b) होती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.